dataWithContentsOfURL не получает данные

Я пытаюсь получить исходный код этой страницы (http://www.sanmarinocard.sm), но dataWithContentsOfURL не получает данные.

NSURL *url = [NSURL URLWithString:@"http://www.sanmarinocard.sm"];
NSData *responseData = [NSData dataWithContentsOfURL:url];
NSString *result = [[NSString alloc] initWithData:responseData encoding:NSASCIIStringEncoding];

Еще несколько дней назад все работало нормально, но со вчерашнего дня никаких результатов.

Вы можете мне помочь? Спасибо.

3 ответа

Решение

Я обнаружил, что мое приложение заблокировано с сайта путем фильтрации пользовательского агента. Я изменил значение, и теперь оно работает отлично.

Я изменил код следующим образом:

NSString *userAgent = @"Mozilla/4.0 (compatible; MSIE 5.23; Mac_PowerPC)";
NSURL *url = [NSURL URLWithString: @"http://www.sanmarinocard.sm"];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:url];
[request setValue:userAgent forHTTPHeaderField:@"User-Agent"];
NSURLResponse *response = nil;
NSError *error = nil;
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
NSString *result = [[NSString alloc] initWithData:responseData encoding:NSASCIIStringEncoding];

Спасибо!

Да, это работает и для меня. Возможно, сервер был временно недоступен.

Не рекомендуется использовать dataWithContentsOfURL: так как он синхронный и будет блокировать работу вашего приложения; если сервер не отвечает, он может заблокировать ваше приложение на долгое время.

Предпочтительным методом было бы использовать NSMutableURLRequest и отправить асинхронный запрос. Это позволит вашему приложению оставаться отзывчивым во время загрузки, а также позволит установить интервал ожидания и легче обрабатывать любые ошибки.

NSURL *url = [NSURL URLWithString:@"http://www.sanmarinocard.sm"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setTimeoutInterval: 10.0]; // Will timeout after 10 seconds
[NSURLConnection sendAsynchronousRequest:request
                                   queue:[NSOperationQueue currentQueue]
                       completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {

    if (data != nil && error == nil)
    {
        NSString *sourceHTML = [[NSString alloc] initWithData:data];
        // It worked, your source HTML is in sourceHTML
    }
    else
    {
        // There was an error, alert the user
    }

   }];

Теперь работает нормально. Возможно, ошибка произошла из-за временной недоступности сервера.

Более того, как уже упоминалось ранее, используя NSUTF8StringEncoding очень рекомендую.

РЕДАКТИРОВАТЬ:

Это также может быть связано с кэшированием: dataWithContentsOfURL: использует NSURLConnection под капотом, который кэширует ответы по умолчанию. Посмотрите на этот вопрос, как это игнорировать.

Другие вопросы по тегам