PHP cURL error: "пустой ответ с сервера"
у меня есть функция класса для взаимодействия с RESTful API для Последний.FM - его цель-захватить самые последние треки для моего пользователя. Вот это:
private static $base_url = 'http://ws.audioscrobbler.com/2.0/';
public static function getTopTracks($options = array())
{
$options = array_merge(array(
'user' => 'bachya',
'period' => NULL,
'api_key' => 'xxxxx...', // obfuscated, obviously
), $options);
$options['method'] = 'user.getTopTracks';
// Initialize cURL request and set parameters
$ch = curl_init();
curl_setopt_array($ch, array(
CURLOPT_URL => self::$base_url,
CURLOPT_POST => TRUE,
CURLOPT_POSTFIELDS => $options,
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_TIMEOUT => 30,
CURLOPT_USERAGENT => 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)'
));
$results = curl_exec($ch);
return $results;
}
возвращает "Empty reply from server"
. Я знаю, что некоторые предположили, что эта ошибка происходит из-за какой-то ошибки в сетевой инфраструктуре; я не верю, что это верно в моем случае. Если я запускаю запрос cURL через командную строку, я получаю свои данные; последний.FM-сервис работает и доступен.
Перед I пойдите к этим людям и посмотрите, изменилось ли что-нибудь, я хотел проверить с вами прекрасные люди и посмотреть, есть ли какая-то проблема в моем коде, которая будет причиной этого.
спасибо!
ответ: @Jan Kuboschek помог мне наткнуться на то, что (возможно) происходит здесь. Отдавая CURLOPT_POSTFIELDS
ассоциативный массив, определенный тип контента указан, который может не работать с определенными службами RESTful. Более разумным решением является ручное создание url-кодированной версии этого данные и передайте это как CURLOPT_POSTFIELDS
.
для получения дополнительной информации проверьте: http://www.brandonchecketts.com/archives/array-versus-string-in-curlopt_postfields
5 ответов
общей проблемой являются пробелы в URL - начале, в середине или в конце. Ты это проверил?
редактировать - в комментариях ниже, расстояние не проблема.
Я запустил ваш код и имел ту же проблему - никакого вывода вообще. Я попробовал URL-адрес и с запросом GET сервер разговаривает со мной. Я бы сделал следующее:
используйте следующее Как $base_url: $base_url = 'http://ws.audioscrobbler.com/2.0/?user=bachya&period=&api_key=xxx&method=user.getTopTracks';
удалите поля post из вашего запроса.
редактировать Я переместил ваш код из класса, так как у меня не было остального, и изменил его. Следующий код работает идеально для меня. Если эти изменения не работают для вас, я предлагаю, чтобы ваша ошибка была в другой функции.
<?php
function getTopTracks()
{
$base_url = 'http://ws.audioscrobbler.com/2.0/?user=bachya&period=&api_key=8066d2ebfbf1e1a8d1c32c84cf65c91c&method=user.getTopTracks';
$options = array_merge(array(
'user' => 'bachya',
'period' => NULL,
'api_key' => 'xxxxx...', // obfuscated, obviously
));
$options['method'] = 'user.getTopTracks';
// Initialize cURL request and set parameters
$ch = curl_init($base_url);
curl_setopt_array($ch, array(
CURLOPT_URL => $base_url,
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_TIMEOUT => 30,
CURLOPT_USERAGENT => 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)'
));
$results = curl_exec($ch);
return $results;
}
echo getTopTracks();
?>
сервер получил запрос, но отправил пустой ответ. Проверьте результат curl_getinfo($ch, CURLINFO_HTTP_CODE)
чтобы узнать, ответил ли сервер с кодом ошибки HTTP.
обновление: Ok, поэтому сервер отвечает 100 Continue
код состояния HTTP. В этом случае это должно решить вашу проблему:
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
Я нашел вот это: PHP и cURL: отключение 100-ПРОДОЛЖИТЬ заголовок. Надеюсь, это сработает!
согласно последнему.FM документация по API вы должны использовать метод GET вместо POST для передачи параметров. Когда я изменил сообщение, чтобы получить, я получил ответ о неправильном ключе.
а вот код получить информацию об альбоме С Лэфта.FM, даже если ошибка возврата:
Функции:
function getAlbum($xml,$artist,$album)
{
$base_url = $xml;
$options = array_merge(array(
'user' => 'YOUR_USERNAME',
'artist'=>$artist,
'album'=>$album,
'period' => NULL,
'api_key' => 'xYxOxUxRxxAxPxIxxKxExYxx',
));
$options['method'] = 'album.getinfo';
// Initialize cURL request and set parameters
$ch = curl_init($base_url);
curl_setopt_array($ch, array(
CURLOPT_URL => 'http://ws.audioscrobbler.com/2.0/',
CURLOPT_POST => TRUE,
CURLOPT_POSTFIELDS => $options,
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => array( 'Expect:' ) ,
CURLOPT_USERAGENT => 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)'
));
$results = curl_exec($ch);
unset ($options);
return $results;
}
использование:
// Get the XML
$xml_error = getAlbum($xml,$artist,$album);
// Show XML error
if (preg_match("/error/i", $xml_error)) {
echo " <strong>ERRO:</strong> ".trim(strip_tags($xml_error));
}
Я пришел acorss тот же вопрос. Мой Http_code вернул 200, но мой ответ был пуст. Причин для этого могло быть много.
--ваши hedaers могут быть неправильными
CURLOPT_HTTPHEADER => array('Content-Type:application/json', 'Expect:')
--вам может потребоваться отправить данные в виде полей post в culr и не прикрепляться к URl-адресу, например URL-адрес?П1=П1&П2=А2
$data = array (p1=>a1, p2=>a2)
CURLOPT_POSTFIELDS => $data
таким образом, Ваш массив опций будет похож на приведенный ниже
array(
CURLOPT_URL => $url,
CURLOPT_FAILONERROR => TRUE, // FALSE if in debug mode
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_TIMEOUT => 4,
CURLOPT_HTTPHEADER => array('Content-Type:application/json', 'Expect:'),
CURLOPT_POST => TRUE,
CURLOPT_POSTFIELDS => $data,
);