cURL 未获取预期的 POST 响应 - 错误 405

Posted

技术标签:

【中文标题】cURL 未获取预期的 POST 响应 - 错误 405【英文标题】:cURL not fetching the expected POST response - error 405 【发布时间】:2014-04-13 23:08:31 【问题描述】:

我需要从 Highcharts 导出服务器获取几个图表(因为我还没有在自己的服务器上实现该功能)。

Highcharts 在这里展示了一个非常清晰的示例: http://export.highcharts.com/demo

我尝试使用来自 Linux 的 curl 命令成功地模拟该表单。

但是,当尝试从 php(特别是从 CakePHP 控制器)运行 curl 时,我收到一个 HTTP 错误:

HTTP 状态 405 - 不支持请求方法“POST”

出了点问题,因为 POST 方法从导航器和 curl 命令交互地工作。

另外,我测试了指向 posttestserver.com 的 PHP 脚本,该站点旨在调试 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”

我做错了什么?

非常感谢。

【问题讨论】:

【参考方案1】:

你的网址错误,改一下:

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

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

【讨论】:

【参考方案2】:

使用http_build_query() 在您的帖子参数数组上发布帖子。否则将其识别为多部分表单发布。

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

请确保POST 网址也正确。

【讨论】:

感谢@sabuj-hassan,它成功了!服务器收到请求,但它显示一条通知说:“manadatory svg POST 参数未定义。”即使我将它添加到参数数组中。事实上,它可以在没有 svg 字段的命令行中运行。 终于成功了。我刚刚向 CURLOPT_POSTFIELDS 传递了一个干净(未编码)值的数组,正如您所报告的那样,只通过 http_build_query() 传递了一次,以解决最后一个问题。此外,我必须删除 curl_init 上的尾随“演示”,因为在原始形式中,操作是“./”(当前目录),以解决最初的问题。谢谢:)

以上是关于cURL 未获取预期的 POST 响应 - 错误 405的主要内容,如果未能解决你的问题,请参考以下文章

php怎么响应客户端发送http请求

从 PHP Curl 获取 POST Zapier webhook 响应

Flutter - 在得到预期的 200 之前总是得到错误的 POST 400 响应

无法使用 wininet 获取 POST 请求响应

curL 返回 404 错误

获取缓存响应 - 无缓存标头未按预期工作