21

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

如果可能的话,我更喜欢在没有委托的情况下进行检查的方法。我需要阻止程序执行,直到我知道 URL 是否可以访问。

4

4 回答 4

39

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

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

但是对于 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);
        }
    }
}
于 2009-09-10T10:14:57.653 回答
30

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

    -(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;
     }
于 2010-07-27T20:30:15.730 回答
8

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

我更改NSURLRequestNSMutableURLRequest,并添加:

[request setHTTPMethod:@"HEAD"];

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

 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]);
于 2014-02-20T00:45:02.143 回答
2

您可以通过调用实现同步连接:

NSURLRequest* request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];
NSHTTPURLResponse* response = nil;
NSError* error = nil;
[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

在发出请求之前,您的线程将被阻塞。

于 2009-09-10T16:48:06.340 回答