PHP подключается к MediaWiki API и получает данные

Я заметил, что есть вопрос, несколько похожий на мой, только с C #: текст ссылки < / а>. Позвольте мне объяснить: я новичок во всей реализации веб-сервисов и поэтому испытываю некоторые трудности с пониманием (особенно из-за расплывчатого руководства MediaWiki API).

Я хочу получить всю страницу в виде строки в PHP (файл XML), а затем обработать ее в PHP (я почти уверен, что есть и другие более сложные способы синтаксического анализа файлов XML, но неважно): Главная страница википедии.

Я пробовал делать $fp = fopen($url,'r');. Он выводит: HTTP request failed! HTTP/1.0 400 Bad Request. API не требует ключа для подключения к нему.

Можете подробно описать, как подключиться к API и получить страницу в виде строки?

РЕДАКТИРОВАТЬ: URL-адрес $url='http://en.wikipedia.org/w/api.php?action=query&prop=revisions&rvprop=content&format=xml&redirects&titles=Main Page';. Я просто хочу прочитать все содержимое файла в строке, чтобы использовать его.


person Gal    schedule 13.12.2009    source источник
comment
вы можете показать нам еще немного кода?   -  person Galen    schedule 13.12.2009


Ответы (3)


Подключиться к этому API так же просто, как получить файл,

fopen

$url = 'http://en.wikipedia.org/w/api.php?action=query&prop=revisions&rvprop=content&format=xml&redirects&titles=Main%20Page';
$fp = fopen($url, 'r');
while (!feof($fp)) {
    $c .= fread($fp, 8192);
}
echo $c;

file_get_contents

$url = 'http://en.wikipedia.org/w/api.php?action=query&prop=revisions&rvprop=content&format=xml&redirects&titles=Main%20Page';
$c = file_get_contents($url);
echo $c;

Две указанные выше можно использовать только в том случае, если на вашем сервере включены fopen оболочки.

В противном случае, если на вашем сервере установлен cURL, вы можете использовать это,

$url = 'http://en.wikipedia.org/w/api.php?action=query&prop=revisions&rvprop=content&format=xml&redirects&titles=Main%20Page';
$ch = curl_init($url);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
$c = curl_exec($ch);
echo $c;
person Galen    schedule 13.12.2009
comment
большое спасибо! вы знаете, как я могу включить обертки fopen на моем локальном apache? - person Gal; 13.12.2009
comment
убедитесь, что allow_url_fopen = 1 в вашем php ini. php.net/manual/en/ - person Galen; 13.12.2009

Вероятно, вам потребуется urlencode для параметров, которые вы передаете в строке запроса; здесь, по крайней мере, "Main Page" требует кодировки - без этой кодировки я тоже получаю ошибку 400.

Если вы попробуете это сделать, это должно работать лучше (обратите внимание, что пробел заменен на %20):

$url='http://en.wikipedia.org/w/api.php?action=query&prop=revisions&rvprop=content&format=xml&redirects&titles=Main%20Page';
$str = file_get_contents($url);
var_dump($str);

Таким образом я получаю содержимое страницы.


Решением является использование urlencode, чтобы вам не приходилось кодировать себя:

$url='http://en.wikipedia.org/w/api.php?action=query&prop=revisions&rvprop=content&format=xml&redirects&titles=' . urlencode('Main Page');
$str = file_get_contents($url);
var_dump($str);
person Pascal MARTIN    schedule 13.12.2009

Согласно документации MediaWiki API, если вы не укажете User-Agent в своем запросе PHP, WikiMedia откажется от соединения с кодом ответа HTTP 4xx:

https://www.mediawiki.org/wiki/API:Main_page#Identifying_your_client

Вы можете попробовать обновить свой код, чтобы добавить этот заголовок запроса, или изменить настройку по умолчанию в php.ini, если у вас есть права на редактирование.

person arpieb    schedule 08.10.2012