У меня есть функция класса для взаимодействия через интерфейс с УСПОКОИТЕЛЬНЫМ 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"
. Я знаю, что некоторые предположили, что эта ошибка прибывает из некоторого отказа в сетевой инфраструктуре; я не полагаю, что это верно в моем случае. Если я выполняю ВИХРЕВОЙ запрос через командную строку, я получаю свои данные; Последнее. Сервис FM возрос и доступен.
Прежде чем я буду переходить к тем людям и буду видеть, изменилось ли что-нибудь, я хотел согласовать с Вами прекрасные люди и видеть, существует ли некоторая проблема в моем коде, который вызвал бы это.
Спасибо!
ОТВЕТ: Kuboschek @Jan помог мне споткнуться на то, что (возможно), продолжается здесь. Путем предоставления CURLOPT_POSTFIELDS
ассоциативный массив, конкретный тип контента указан, который не может работать с определенными УСПОКОИТЕЛЬНЫМИ сервисами. Более умное решение состоит в том, чтобы вручную создать закодированную URL версию тех данных и передачи что как CURLOPT_POSTFIELDS
.
Для большего количества информации проверьте: http://www.brandonchecketts.com/archives/array-versus-string-in-curlopt_postfields
Распространенной проблемой являются пробелы в URL-адресе - в начале, в середине или в конце. Вы это проверили?
Редактировать - согласно комментариям ниже, проблема не в интервалах.
Я запустил ваш код и столкнулся с той же проблемой - никакого вывода. Я попробовал URL-адрес, и с запросом GET сервер разговаривает со мной. Я бы сделал следующее:
Используйте в качестве $ base_url следующее: $ base_url = ' http://ws.audioscrobbler.com/2.0/?user=bachya&period=&api_key=xxx&method=user.getTopTracks ';
Удалите поля сообщения из вашего запроса.
Редактировать Я убрал ваш код из класса, так как остального у меня не было, и изменил его. Следующий код идеально подходит для меня. Если эти изменения не работают для вас, я предлагаю, чтобы ваша ошибка была в другой функции.
<?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();
?>
Согласно документации API Last.FM , для передачи параметров следует использовать метод GET вместо POST. Когда я изменил POST на GET, я получил ответ о неправильном ключе.
Сервер получил ваш запрос, но отправил пустой ответ. Проверьте результат curl_getinfo($ch, CURLINFO_HTTP_CODE)
, чтобы узнать, ответил ли сервер кодом ошибки HTTP.
Обновление: Итак, сервер отвечает кодом состояния HTTP 100 Continue
. В таком случае, это должно решить вашу проблему:
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
Я нашел это здесь: PHP и cURL: Отключение заголовка 100-continue. Надеюсь, это сработает!