Проверьте, возвращает ли NSURL 404
Мне нужно проверить, доступен ли URL (представленный NSURL) или возвращает 404. Каков наилучший способ для этого?
Я бы предпочел, чтобы проверить это без делегата, если это возможно. Мне нужно заблокировать выполнение программы, пока не узнаю, доступен ли URL или нет.
Ответы
Ответ 1
Как вы уже знаете, эта общая ошибка может захватить методом 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);
}
}
}
Ответ 2
Мне понадобилось решение, в котором не использовался делегат, поэтому я взял фрагменты кода, показанные в других ответах здесь, и создал простой метод, который хорошо работает в моем случае (и может быть, и то, что вы ищете)
-(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;
}
Ответ 3
Я использовал ответ из 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]);
Ответ 4
Вы можете добиться синхронного соединения, вызвав:
NSURLRequest* request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];
NSHTTPURLResponse* response = nil;
NSError* error = nil;
[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
Ваш поток будет блокироваться до тех пор, пока запрос не будет выполнен.