【问题标题】:How can I send raw POST data with cURL? (PHP)如何使用 cURL 发送原始 POST 数据? (PHP)
【发布时间】:2012-10-17 10:36:51
【问题描述】:

我正在尝试使用 $HTTP_RAW_POST_DATA 将原始 POST 数据发送到页面,但我的尝试失败了,并且给出了未定义的索引通知。

我尝试了以下方法:

curl_setopt($handle, CURLOPT_POSTFIELDS, 'Raw POST data');   // Doesn't seem to work at all.
curl_setopt($handle, CURLOPT_POSTFIELDS, array('Raw POST data'));   // 0 => Raw POST data

我做了一些研究,有人建议在请求中发送标头 (Content-Type: text/plain),这似乎没有任何影响.

这个问题有解决办法吗?

【问题讨论】:

    标签: php post curl


    【解决方案1】:

    出于某种奇怪的原因,上述标题似乎可以解决它。以前它不起作用,我不确定为什么它现在起作用了。

    不管怎样,不知道的人,代码如下:

    curl_setopt($handle, CURLOPT_HTTPHEADER, array('Content-Type: text/plain'));
    

    【讨论】:

      【解决方案2】:

      您在发送方/接收方周期的响应部分遇到错误。

      虽然这很可能是 sender 的问题(它没有发送正确的请求),但也可能是由 receiving PHP 中的错误配置引起的脚本。也就是说,即使请求是正确的,接收者也可能没有HTTP_RAW_POST_DATA 可用。

      见:http://www.php.net/manual/en/ini.core.php#ini.always-populate-raw-post-data

      始终填充包含原始 POST 数据的 $HTTP_RAW_POST_DATA。 否则,仅使用无法识别的 MIME 类型填充变量 的数据。但是,访问原始 POST 的首选方法 数据是 php://input。 $HTTP_RAW_POST_DATA 不适用于 enctype="multipart/form-data"。

      所以首先要检查的是$HTTP_RAW_POST_DATA 是否确实已填充,从上面的页面中需要:

      1. .ini 变量 always_populate_raw_post_data 为 True,
      2. 或者发送 POST 时使用 POST 处理程序无法识别的 Content-Type(也许可以使用“text/raw”)

      此时,发送数据的正确方式应该是

      curl_setopt($handle, CURLOPT_POSTFIELDS, urlencode('Raw POST data'));
      

      但是,请注意接收这些数据的推荐方式根本不依赖$HTTP_RAW_POST_DATA,而是读取虚拟文件php://input的内容。

      php://input 是一个只读流,允许您读取原始数据 从请求正文。在 POST 请求的情况下,最好 使用 php://input 而不是 $HTTP_RAW_POST_DATA 因为它没有 依赖于特殊的 php.ini 指令。此外,对于那些情况 $HTTP_RAW_POST_DATA 默认不填充,它是一个潜在的 激活时内存占用较少的替代方案 always_populate_raw_post_data。

      【讨论】:

      • 我很确定接收器没有问题,因为手动发送 POST 数据可以正常工作(使用 Firefox 的 Live HTTP Headers 附加组件)。我知道 php://input 以及它如何更好,但是,在这种情况下,我需要 $HTTP_RAW_POST_DATA 的解决方案。感谢您的回复!
      • 好吧,在这种情况下,您可以在 PHP.INI 中设置 always-populate-raw-post-data 设置;或者您可以发送“无法识别的”(无论 是什么意思)“MIME 类型”来强制填充 $HTTP_RAW_POST_DATA。正在更新答案...
      • 这个答案似乎与最初的问题无关,这实际上是关于使用 PHP 的 libcurl 执行 HTTP 请求,而不是访问发送到在 Web 服务器中运行的 PHP 脚本的 POST 数据。
      • @Shadocko - 原始问题确实描述了一个未定义的索引错误从运行在 Web 服务器中的 PHP 脚本访问 POST 数据时。我很容易承认,在这种特定情况下,错误出在发送脚本中,但我给出的解决方案与我亲眼观察到的情况有关,并且知道会发生。虽然这不是针对这种特定情况的答案,但它很可能适合正在寻找相同事物的其他人。
      • @lserni 好的,很抱歉投反对票,没有意识到 PHP 脚本在将其捆绑到另一个 HTTP 请求之前确实收到了 $HTTP_RAW_POST_DATA 中的数据,因此您的回答可能很有用。我的投票已锁定,但如果您修改答案,我将取消它。
      猜你喜欢
      • 2017-12-06
      • 2010-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-24
      • 2021-05-05
      • 2017-08-20
      相关资源
      最近更新 更多