2012-10-27 49 views
4

我试图使用$ HTTP_RAW_POST_DATA将原始POST数据发送到页面,但是我的尝试失败并给出了未定义的索引通知。如何使用cURL发送原始POST数据? (PHP)

我已经尝试以下操作:在请求,没有不包括:(text/plain的的Content-Type)

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 

我做了一些研究和一些人曾建议发送头似乎影响任何东西。

如果有人能够为这个问题提供解决方案,我将不胜感激。谢谢!

回答

1

由于一些奇怪的原因,上述标题似乎解决了它,以前它不工作,我不确定它为什么现在可以工作。 不管怎么说,对于那些不知道这是谁的代码:

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

您在发件人/收件人周期的回复部分中收到错误。

虽然这很可能是在发件人(不发送一个适当的请求)的问题,也可以通过在接收 PHP脚本配置错误引起的。即使请求是正确的,接收方可能仍然没有HTTP_RAW_POST_DATA可用。

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

总是产生$ HTTP_RAW_POST_DATA包含有原始的POST数据。 否则,该变量仅填充数据的无法识别的MIME类型 。但是,访问原始POST 数据的首选方法是php://输入。 $ HTTP_RAW_POST_DATA不适用于 enctype =“multipart/form-data”。

所以要检查的第一件事就是$HTTP_RAW_POST_DATA是否确实填充,从网页上面要求之一:

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

此时,发送数据的正确方法是

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

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

php://输入是一个只读流,允许您从请求主体读取原始数据 。在POST请求的情况下,最好 使用php://输入,而不是$HTTP_RAW_POST_DATA,因为它不依赖于特殊的php.ini指令,因此不会使用 。而且,对于默认情况下未填充 $ HTTP_RAW_POST_DATA的情况,这是潜在的 较少的内存密集型替代方式,以激活 always_populate_raw_post_data。

+0

我相当肯定的接收器工作正常(使用Live HTTP头添加为Firefox)的罚款,手动发送POST数据。 我知道php://输入以及它如何更好,但是,在这种情况下,我需要$ HTTP_RAW_POST_DATA的解决方案。 谢谢你的回复! – user1488335

+0

那么,在这种情况下,您可以在PHP.INI中设置always-populate-raw-post-data设置;或者你可以发送一个“无法识别的”(无论*表示*)“MIME类型”来强制使用'$ HTTP_RAW_POST_DATA'。更新答案... – LSerni

+0

这个答案似乎与原始问题无关,这个问题实际上是关于使用PHP中的libcurl执行HTTP请求,而不是访问发送给运行在Web服务器中的PHP脚本的POST数据。 – Shadocko