cURL не получает ожидаемый ответ POST — ошибка 405

Мне нужно получить несколько диаграмм с экспортного сервера Highcharts (поскольку я еще не реализовал эту функцию на своем собственном сервере).

Highcharts показывает здесь очень наглядный пример: http://export.highcharts.com/demo

Я попытался успешно смоделировать эту форму с помощью команды curl из Linux.

Но при попытке запустить curl из PHP (в частности, из контроллера CakePHP) я получаю ошибку HTTP:

Статус HTTP 405 — метод запроса «POST» не поддерживается

Что-то не так, так как метод POST работал интерактивно из навигатора и из команды curl.

Кроме того, я протестировал PHP-скрипт, указав его на posttestserver.com, сайт, предназначенный для отладки результатов POST-запросов. Результат моего теста здесь: http://www.posttestserver.com/data/2014/03/10/10.18.221071980127

Это код метода контроллера CakePHP:

public function obtenir() {

    $ch = curl_init("http://export.highcharts.com/demo");

    curl_setopt($ch, CURLOPT_POST, TRUE);
    curl_setopt($ch, CURLOPT_POSTFIELDS, array(
            "content" => "options",
            "options" => "%7B%0D%0A%09xAxis%3A+%7B%0D%0A%09%09categories%3A+%5B%27Jan%27%2C+%27Feb%27%2C+%27Mar%27%2C+%27Apr%27%2C+%27May%27%2C+%27Jun%27%2C+%27Jul%27%2C+%27Aug%27%2C+%27Sep%27%2C+%27Oct%27%2C+%27Nov%27%2C+%27Dec%27%5D%0D%0A%09%7D%2C%0D%0A%09series%3A+%5B%7B%0D%0A%09%09data%3A+%5B29.9%2C+71.5%2C+106.4%2C+129.2%2C+144.0%2C+176.0%2C+135.6%2C+148.5%2C+216.4%2C+194.1%2C+95.6%2C+54.4%5D%0D%0A%09%7D%5D%0D%0A%7D%3B%0D%0A",
            "type" => "image%2Fpng",
            "width" => "",
            "scale" => "",
            "constr" => "Chart",
            "callback" => "function%28chart%29+%7B%0D%0A%09chart.renderer.arc%28200%2C+150%2C+100%2C+50%2C+-Math.PI%2C+0%29.attr%28%7B%0D%0A%09%09fill+%3A+%27%23FCFFC5%27%2C%0D%0A%09%09stroke+%3A+%27black%27%2C%0D%0A%09%09%27stroke-width%27+%3A+1%0D%0A%09%7D%29.add%28%29%3B%0D%0A%7D%0D%0A%09%09%09",
            ));
    curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-type: application/x-www-form-urlencoded; charset=UTF-8"));
    curl_setopt($ch, CURLINFO_HEADER_OUT, TRUE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);

    $page = curl_exec($ch);

    $head = curl_getinfo($ch, CURLINFO_HEADER_OUT);
    debug($head);
    debug($page);

    curl_close($ch);

}

Результатом debug($page) является текст в формате HTML со значительным содержимым:

Статус HTTP 405 — метод запроса «POST» не поддерживается

Что я делаю не так?

Большое спасибо.


person Roger Campanera    schedule 10.03.2014    source источник


Ответы (2)


Используйте http_build_query() для публикации над массивом параметров публикации. В противном случае он распознается как публикация составной формы.

curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query( array(...) ));

Пожалуйста, убедитесь, что URL-адрес POST также верен.

person Sabuj Hassan    schedule 10.03.2014
comment
Спасибо @sabuj-hassan, это сработало! Сервер получает запрос, но показывает уведомление: обязательный параметр svg POST не определен. даже если я добавлю его в массив параметров. А дело в том, что работало из командной строки без поля svg. - person Roger Campanera; 10.03.2014
comment
Наконец, это работает. Я только что передал в CURLOPT_POSTFIELDS массив чистых (незакодированных) значений, прошедших через http_build_query() только один раз, как вы сообщили, для решения последней проблемы. Кроме того, мне пришлось удалить завершающую демонстрацию на curl_init, поскольку в исходной форме действие было ./ (текущий каталог), чтобы решить первоначальную проблему. Спасибо :) - person Roger Campanera; 11.03.2014

Неверный URL-адрес, измените:

$ch = curl_init("http://export.highcharts.com/demo");

to

$ch = curl_init("http://export.highcharts.com");
person Xelhua Joseph Corona Pérez    schedule 05.03.2017