iPhone - можно запросить Википедию, чтобы увидеть, существует ли веб-страница? - PullRequest
0 голосов
/ 02 августа 2011

Мне любопытно, есть ли способ узнать, существует ли страница википедии, у меня реализован пользовательский поиск, который заменяет пробелы в поиске на _, однако у меня нет способа проверить, существует ли этот путь на самом деле.

    targetWiki = inputCustomTarget.text;
    targetWiki = [targetWiki stringByReplacingOccurrencesOfString:@" " withString:@"_"];
    targetWiki = [NSString stringWithFormat:@"http://en.m.wikipedia.org/wiki/%@", targetWiki];    

Должен ли я проанализировать ответ, чтобы узнать, существует ли страница?

Ответы [ 3 ]

2 голосов
/ 02 августа 2011

Не нужно анализировать результат, просто проверьте код ответа 200 в обратном вызове - (void)connection:(NSURLConnection*)connection didReceiveResponse:(NSURLResponse*)response.Если он не существует, вы должны получить 404.

Редактировать:

Я хотел бы добавить те страницы, которые не существуют на Main Страница Wikipedia (не mobile .m) действительно возвращает правильный код ошибки 404.Это может измениться в будущем и может быть не совсем надежным, если они что-то изменят, но при этом не выполняется анализ содержимого.Вот пример, который я собрал, чтобы доказать это.

NSURLRequest *exists = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://en.wikipedia.org/wiki/Qwerty"]];
//Redirects to Blivet
NSURLRequest *redirects = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://en.wikipedia.org/wiki/Poiuyt"]];
NSURLRequest *nonexistant = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://en.wikipedia.org/wiki/Jklfdsa"]];

NSHTTPURLResponse *resp_exists;
NSHTTPURLResponse *resp_redirects;
NSHTTPURLResponse *resp_nonexistant;

[NSURLConnection sendSynchronousRequest:exists returningResponse:&resp_exists error:NULL];
[NSURLConnection sendSynchronousRequest:redirects returningResponse:&resp_redirects error:NULL];
[NSURLConnection sendSynchronousRequest:nonexistant returningResponse:&resp_nonexistant error:NULL];

NSLog(@"\nExists: %d\nRedirects: %d\nNon Existant: %d", 
      [resp_exists statusCode], 
      [resp_redirects statusCode], 
      [resp_nonexistant statusCode] );

А вот вывод

Существует: 200Перенаправления: 200Несуществующий: 404

Таким образом, если страница существует или автоматически перенаправляет на существующую страницу, вы получите код ошибки 200, если он не существует, вы получите 404. Есливам нужно перехватить перенаправление, которое вам понадобится, реализовать -connection:willSendRequest:redirectResponse: и действовать соответствующим образом.

Примечание. Этот пример кода является синхронным для компактности.Это не идеально, и производственные реализации должны отправлять асинхронный запрос и использовать методы NSURLConectionDelegate.

1 голос
/ 02 августа 2011

Вы не можете проверить код ответа, потому что он всегда будет возвращать код ответа 200.

Я думаю, что лучший способ узнать, существует ли страница, - это проанализировать ответ и проверить, попадете ли вы настраница результатов поиска по умолчанию.

Другой вариант - использовать API .

1008 *http://en.wikipedia.org/w/api.php?action=opensearch&search=term

MediaWiki.был найден объект в возвращенном ответе.

0 голосов
/ 02 августа 2011

Да, боюсь, вам, вероятно, потребуется проанализировать результаты, чтобы узнать, существует ли страница.Однако может быть альтернатива, если вы посмотрите на полные файлы дампов английской википедии, которые доступны здесь;

http://en.wikipedia.org/wiki/Wikipedia:Database_download#Latest_complete_dump_of_English_Wikipedia

Очевидно, что эти необработанные данные огромны, но вы могли бы написать парсернайти все действительные ссылки и затем сжать эту информацию, скажем, в базе данных coreData, которую вы можете найти на iPhone.Тогда вы можете запустить проверку, не проверяя страницу.

Но, если честно, я, вероятно, проанализирую страницу и, возможно, кеширую ответ, поэтому мне придется сделать это только один раз.

РЕДАКТИРОВАТЬ: Боюсь, ответ Джо не совсем правильно.Когда я использую домен, который использовался в исходном вопросе (например, en.m.wikipedia.org), пример кода Джо дает следующий вывод:

Exists: 200
Redirects: 200
Non Existant: 200

Если я использую en.wikipedia.org, тогда мои результаты совпадают с Джо, однако это не был заданный вопрос.Я живу в Великобритании, и это также может повлиять на результаты.

...