检查NSURL是否返回404

Eri*_*rik 20 iphone nsurlconnection

我需要检查URL(由NSURL表示)是否可用或返回404.实现该目标的最佳方法是什么?

如果可能的话,我更愿意在没有代表的情况下检查这个问题.我需要阻止程序执行,直到我知道URL是否可访问.

Jir*_*ong 39

您可能已经知道,didFailWithError方法可以捕获一般错误:

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    NSLog(@"Connection failed! Error - %@ %@",
          [error localizedDescription],
          [[error userInfo] objectForKey:NSErrorFailingURLStringKey]);
}
Run Code Online (Sandbox Code Playgroud)

但是对于404"未找到"或500"内部服务器错误"应该能够捕获didReceiveResponse方法内部:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    if ([response respondsToSelector:@selector(statusCode)])
    {
        int statusCode = [((NSHTTPURLResponse *)response) statusCode];
        if (statusCode == 404)
        {
            [connection cancel];  // stop connecting; no more delegate messages
            NSLog(@"didReceiveResponse statusCode with %i", statusCode);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,NSHTTPURLResponse上有一个方便的类方法,用于返回错误代码的本地化描述:`[NSHTTPURLResponse localizedStringForStatusCode:[response statusCode]]` (7认同)
  • 我确定你在Swift版本中这样做.手工转换并不困难. (3认同)

小智 29

我需要一个不使用委托的解决方案,所以我在这里采用了其他答案中显示的代码片段并创建了一个在我的情况下运行良好的简单方法(也可能是你正在寻找的):

    -(BOOL) webFileExists {

        NSString *url = @"http://www.apple.com/somefile.html";

        NSURLRequest* request = [NSURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:5.0];
        NSHTTPURLResponse* response = nil;
        NSError* error = nil;
        [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
        NSLog(@"statusCode = %d", [response statusCode]);

        if ([response statusCode] == 404)
            return NO;
        else
            return YES;
     }
Run Code Online (Sandbox Code Playgroud)


小智 8

我使用了上面woodmantech的答案,但是根据我在其他类似问题上看到的内容进行了更改,以便它不会下载整个文件以查看它是否存在.

我换NSURLRequestNSMutableURLRequest,并补充说:

[request setHTTPMethod:@"HEAD"];
Run Code Online (Sandbox Code Playgroud)

这似乎工作正常.我正在开发我的第一个应用程序,所以还没有真正的经验.感谢大家.

 NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:5.0];
    [request setHTTPMethod:@"HEAD"];
    NSHTTPURLResponse* response = nil;
    NSError* error = nil;
    [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
    NSLog(@"statusCode = %d", [response statusCode]);
Run Code Online (Sandbox Code Playgroud)