【发布时间】:2009-09-10 09:54:36
【问题描述】:
我需要检查一个 URL(由 NSURL 表示)是否可用或返回 404。实现此目的的最佳方法是什么?
如果可能的话,我更喜欢在没有委托的情况下进行检查的方法。我需要阻止程序执行,直到我知道 URL 是否可以访问。
【问题讨论】:
我需要检查一个 URL(由 NSURL 表示)是否可用或返回 404。实现此目的的最佳方法是什么?
如果可能的话,我更喜欢在没有委托的情况下进行检查的方法。我需要阻止程序执行,直到我知道 URL 是否可以访问。
【问题讨论】:
您可能已经知道,一般错误可以通过 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);
}
}
}
【讨论】:
[NSHTTPURLResponse localizedStringForStatusCode: [response statusCode]]
我也需要一个不使用委托的解决方案,因此我采用了此处其他答案中显示的代码片段,并创建了一个在我的情况下运行良好的简单方法(并且可能也是您正在寻找的) :
-(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;
}
【讨论】:
200 状态代码,以便您知道您的文件是可访问的,因为除了404 之外还可能发生任何数量的错误,例如403 Forbidden 和500 Internal Server Error。谢谢!
我使用了上面 woodmantech 的答案,但根据我在这里看到的其他类似问题对其进行了更改,因此它不会下载整个文件以查看它是否存在。
我将NSURLRequest改为NSMutableURLRequest,并添加:
[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]);
【讨论】:
可以通过调用实现同步连接:
NSURLRequest* request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];
NSHTTPURLResponse* response = nil;
NSError* error = nil;
[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
您的线程将阻塞,直到发出请求。
【讨论】:
url 处没有任何内容,则不会阻塞:NSURLConnection 将下载 404 网页的内容。但是您可以使用[response statusCode] 查看状态码