如何在PHP中获得POST的正文?

我作为POST提交到一个PHP页面如下:

{a:1} 

这是请求的主体(POST请求)。
在PHP中,我需要做些什么来提取这个值呢?

 var_dump($_POST); 

是不是解决scheme,不工作。

访问POST或PUT请求(或任何其他HTTP方法)的实体主体:

 $entityBody = file_get_contents('php://input'); 

另外, STDIN常量是一个已经打开的php://inputstream,所以你可以select:

 $entityBody = stream_get_contents(STDIN); 

从I / Ostream文档的PHP手册条目 :

php://input是一个只读stream,允许您从请求主体读取原始数据。 在POST请求的情况下,最好使用php://input而不是$HTTP_RAW_POST_DATA因为它不依赖于特殊的php.ini指令。 而且,对于缺省情况下$HTTP_RAW_POST_DATA未被填充的情况,这对于激活always_populate_raw_post_data是一个潜在的更less内存密集的select。 php://input不可用enctype =“multipart / form-data”。

具体来说,您需要注意的是,无论您如何在Web SAPI中访问它, php://inputstream都是不可search的 。 这意味着它只能被读取一次。 如果你正在一个大型的HTTP实体正常上传的环境中工作,你可能希望保持inputstream的forms(而不是像上面的第一个例子那样缓冲)。

为了维护stream资源,可以这样做:

 <?php function detectRequestBody() { $rawInput = fopen('php://input', 'r'); $tempStream = fopen('php://temp', 'r+'); stream_copy_to_stream($rawInput, $tempStream); rewind($tempStream); return $tempStream; } 

php://temp允许您pipe理内存消耗,因为在存储一定数量的数据(默认为2M)后,它会透明地切换到文件系统存储。 这个大小可以在php.ini文件中操作,也可以通过追加/maxmemory:NN ,其中NN是使用临时文件之前保存在内存中的最大数据量,以字节为单位。

当然,除非你有很好的理由去寻找inputstream,否则你不应该在web应用中使用这个function。 一次读取HTTP请求实体正常就足够了 – 不要让客户端整天等待,而你的应用程序会计算出要做什么。

请注意,php://input不可用于指定Content-Type: multipart/form-data标头(HTML格式中的enctype="multipart/form-data" )的请求。 这导致PHP已经将表单数据parsing为$_POST超全局。

一个空的$_POST一个可能的原因是该请求不是POST ,或不再是POST …它可能已经开始作为后,但遇到301302redirect的地方,这是切换到GET所需!

检查$_SERVER['REQUEST_METHOD']来检查是否是这种情况。

检查$HTTP_RAW_POST_DATAvariables

如果您已经安装了HTTP PECL扩展,您可以使用http_get_request_body()函数以stringforms获取正文数据。

如果你安装了pecl / http扩展,你也可以使用这个:

 $request = new http\Env\Request(); $request->getBody();