|
|
|
|
<?php
header ("Content-Type: text/html;charset=utf-8");
$query = 'yandex';
$page = '0';
$hostname = "xmlsearch.yandex.ru";
$path = "/xmlsearch";
// XML запрос
$doc = <<<DOC
<?xml version='1.0' encoding='utf-8'?>
<request>
<query>$query</query>
<page>$page</page>
<maxpassages>0</maxpassages>
<groupings>
<groupby attr='d' mode='deep' groups-on-page='10' docs-in-group='1' curcateg='-1'/>
</groupings>
</request>
DOC;
function get_content($hostname, $path)
{
$line = "111";
$fp = fsockopen($hostname, 80, $errno, $errstr, 30);
if (!$fp) echo "$errstr ($errno)<br />\n";
else
{
$headers = "GET $path HTTP/1.1\r\n"; //или POST
$headers .= "Host: $hostname\r\n";
$headers .= "Content-type: application/xml"."\r\n";
$headers .= "Content-length:"."strlen($doc)"."\r\n";
$headers .= "Connection: Close\r\n\r\n";
$headers .= "$doc";
fwrite($fp, $headers);
while (!feof($fp))
{
$line .= fgets($fp, 1024);
}
fclose($fp);
}
return $line;
}
get_content($hostname, $path);
var_dump($line);
//$xmldoc = simplexml_load_string($line); //simplexml_load_file
//var_dump($xmldoc);
?>
|
Вместо ожидаемых данных в виду XML, получаю NULL. Вроде заголовки правильные посылаю, да и сервис Яндекса успешно видит мои запросы (отображается в статистике). В чём может быть ошибка? | |
|
|
|
|
|
|
|
для: lgar
(26.08.2009 в 22:12)
| | должно быть
$line = get_content($hostname, $path);
ещё $doc не видно внутри функции , обьявите его там как
global $doc;
//upd
если изменить заголовки
$headers = "POST $path HTTP/1.1\r\n"; //или POST
$headers .= "Host: $hostname\r\n";
$headers .= 'Content-type: application/xml' ."\r\n";
$headers .= 'Content-length: '. strlen($doc) ."\r\n";
$headers .= 'Connection: Close' ."\r\n\r\n";
Всё работает
HTTP/1.1 200 OK
Date: Wed, 26 Aug 2009 19:08:34 GMT
Server: Apache/2.2.9 (Unix) mod_perl/2.0.4 Perl/v5.8.8
Set-Cookie: yandexuid=1094161251313714; path=/; domain=.yandex.ru; expires=Friday, 31-Dec-10 23:59:59 GMT
Vary: Accept-Encoding
Connection: close
Transfer-Encoding: chunked
Content-Type: text/xml
9a
XX.XXX.XXX.XXX not found
0
За исключением того что сервис доступен только для зарегистрированных IP
(мой XX.XXX.XXX.XXX незарегистрирован)
и Transfer-Encoding: chunked
говорит о том что нужно получать цифру, затем такое колличество байт и новую цифру ,
и так пока не будет получен 0
только так можно получить контент без примесей цифр | |
|
|
|
|
|
|
|
для: heed
(26.08.2009 в 22:31)
| | Спасибо, исправил недочёты.
Теперь появилось что-то более интересное. Теперь получается, что неправильный запрос. Вместо xml Content-Type text/html.
string(790)
"111HTTP/1.1 400 Bad Request
Date: Wed, 26 Aug 2009 19:13:15 GMT
Server: Apache/2.2.9 (Unix) mod_perl/2.0.4 Perl/v5.8.8 Vary: Accept-Encoding Content-Length: 558
Connection: close
Content-Type: text/html; charset=iso-8859-1
Bad Request
Your browser sent a request that this server could not understand.
Request header field is missing ':' separator.
<request> <query>yandex</query> <page>0</page> <maxpassages>0</maxpassages> <groupings> <groupby attr='d' mode='deep' groups-on-page='10' docs-in-group='1' curcateg='-1'/> </groupings>
upd.
От этого ошибка не изменилась. Мне кажется, это и не должно повлиять на результат. Видел рабочий скрипт, где после Connection: Close\r\n\r\n что-то отправляли и это работало. Хотя и удивительно.
$headers .= "$doc";
$headers .= "Connection: Close\r\n\r\n";
|
| |
|
|
|
|
|
|
|
для: lgar
(26.08.2009 в 23:16)
| | как-раз редактировал свой пост | |
|
|
|
|
|
|
|
для: lgar
(26.08.2009 в 22:12)
| | Исправил ещё 3 ошибки, но проблема всё равно осталась. Теперь вместо 400, 404. Хотя адрес правильный. И сервис не видит число запросов.
$hostname = 'xmlsearch.yandex.ru';
$path = '/xmlsearch';
|
1) Использовал GET, но запрос оформил для POST.
2) Если использовать GET, то Content-length использовать не нужно.
3) Вместо HTTP 1.1 надо использовать 1.0
В связи с этим возникло пару вопросов:
1) Путь надо записывать так $path = "/xmlsearch"; или $path = "/xmlsearch/"?
2) Порядок следования заголовков. Например, после $headers .= "Connection: Close\r\n\r\n"; можно посылать др. заголовки?
3) На что влияет "\r\n", где нужно использовать "\r\n\r\n"?
$headers = "POST $path HTTP/1.0\r\n";
$headers .= "Host: $hostname\r\n";
$headers .= "Connection: Close\r\n\r\n";
$headers .= "Content-Type: application/xml\r\n";
$headers .= "Content-Length: ".strlen($data)."\r\n".$data."\r\n";
|
| |
|
|
|
|
|
|
|
для: lgar
(30.08.2009 в 20:39)
| | echo '<pre>'.$headers; | |
|
|
|
|
|
|
|
для: lgar
(26.08.2009 в 22:12)
| |
$headers = "POST $path HTTP/1.0\r\n"; //или POST
$headers .= "Host: $hostname\r\n";
$headers .= "Content-Type: application/xml\r\n";
$headers .= "Content-Length: ".strlen($data)."\r\n";
$headers .= "Connection: Close\r\n\r\n";
$headers .= $data;
|
Не знаю почему, но так заработало. Отличий с предыдущим примером я не вижу (. Наверно, из-за того, что "Content-Type и Content-Length до Connection: Close. | |
|
|
|
|
|
|
|
для: lgar
(31.08.2009 в 10:11)
| | Я Вам сказал именно как увидеть отличия. | |
|
|
|