У меня есть функция класса для взаимодействия с RESTful API для Last.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 через командную строку, я получаю свои данные; сервис Last.FM запущен и доступен.
Прежде чем я пойду к этим людям и узнаю, не изменилось ли что-нибудь, я хотел бы проконсультироваться с вами, замечательные люди, и посмотреть, есть ли какая-то проблема в моем коде, которая может вызвать это.
Спасибо!
ОТВЕТ: @Jan Kuboschek помог мне наткнуться на то, что (возможно) здесь происходит. Предоставляя CURLOPT_POSTFIELDS
ассоциативный массив, указывается конкретный тип контента, который может не работать с некоторыми службами RESTful. Более разумное решение — вручную создать версию этих данных в кодировке URL и передать ее как файл CURLOPT_POSTFIELDS
.
Для получения дополнительной информации посетите: http://www.brandonchecketts.com/archives/array-versus-string-in-curlopt_postfields