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 под капотом, который кэширует ответы по умолчанию. Посмотрите на этот вопрос, как это игнорировать.