Вопрос

Мне нужно проверить, доступен ли URL-адрес (представленный NSURL) или возвращает 404. Каков наилучший способ добиться этого?

Я бы предпочел способ проверить это без делегата, если это возможно. Мне нужно заблокировать выполнение программы, пока я не узнаю, доступен ли URL или нет.

Это было полезно?

Решение

Как вы уже знаете, общая ошибка может быть зафиксирована методом didFailWithError:

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

но для 404 "Not Found" или 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);
        }
    }
}

Другие советы

Мне нужно было решение, в котором также не использовался делегат, поэтому я взял фрагменты кода, показанные в других ответах, здесь и создал простой метод, который хорошо работает в моем случае (и может быть тем, что вы ищете).

    -(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;
     }

Я использовал ответ из 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];

Ваша тема будет блокироваться до тех пор, пока не будет выполнен запрос.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top