Ошибка ЗАВИХРЕНИЯ PHP: “Пустой ответ с сервера”

У меня есть функция класса для взаимодействия через интерфейс с УСПОКОИТЕЛЬНЫМ 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

7
задан Rahil Wazir 12 December 2014 в 20:35
поделиться

3 ответа

Распространенной проблемой являются пробелы в URL-адресе - в начале, в середине или в конце. Вы это проверили?

Редактировать - согласно комментариям ниже, проблема не в интервалах.

Я запустил ваш код и столкнулся с той же проблемой - никакого вывода. Я попробовал URL-адрес, и с запросом GET сервер разговаривает со мной. Я бы сделал следующее:

  1. Используйте в качестве $ base_url следующее: $ base_url = ' http://ws.audioscrobbler.com/2.0/?user=bachya&period=&api_key=xxx&method=user.getTopTracks ';

  2. Удалите поля сообщения из вашего запроса.

Редактировать Я убрал ваш код из класса, так как остального у меня не было, и изменил его. Следующий код идеально подходит для меня. Если эти изменения не работают для вас, я предлагаю, чтобы ваша ошибка была в другой функции.

<?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();

?>
11
ответ дан 6 December 2019 в 09:18
поделиться

Согласно документации API Last.FM , для передачи параметров следует использовать метод GET вместо POST. Когда я изменил POST на GET, я получил ответ о неправильном ключе.

0
ответ дан 6 December 2019 в 09:18
поделиться

Сервер получил ваш запрос, но отправил пустой ответ. Проверьте результат curl_getinfo($ch, CURLINFO_HTTP_CODE), чтобы узнать, ответил ли сервер кодом ошибки HTTP.

Обновление: Итак, сервер отвечает кодом состояния HTTP 100 Continue. В таком случае, это должно решить вашу проблему:

curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));

Я нашел это здесь: PHP и cURL: Отключение заголовка 100-continue. Надеюсь, это сработает!

8
ответ дан 6 December 2019 в 09:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: