5

我正在尝试使用$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),这似乎没有任何影响。

这个问题有解决方案吗?

4

2 回答 2

4

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

虽然这很可能是发送方的问题(它没有发送正确的请求),但也可能是由接收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为真,
  2. 或者 POST 发送Content-Type的 POST 处理程序无法识别(也许可以使用“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 相比,它可能是一种内存密集度较低的替代方案。

于 2012-10-27T10:15:31.767 回答
1

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

无论如何,对于那些不知道的人,这是代码:

curl_setopt($handle, CURLOPT_HTTPHEADER, array('Content-Type: text/plain'));
于 2012-10-27T12:15:19.537 回答