如何在PHP中获得POST的正文?
我作为POST提交到一个PHP页面如下:
{a:1}
这是请求的主体(POST请求)。
在PHP中,我需要做些什么来提取这个值呢?
var_dump($_POST);
是不是解决scheme,不工作。
访问POST或PUT请求(或任何其他HTTP方法)的实体主体:
$entityBody = file_get_contents('php://input');
另外, STDIN
常量是一个已经打开的php://input
stream,所以你可以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://input
stream都是不可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
…它可能已经开始作为后,但遇到301
或302
redirect的地方,这是切换到GET
所需!
检查$_SERVER['REQUEST_METHOD']
来检查是否是这种情况。
检查$HTTP_RAW_POST_DATA
variables
如果您已经安装了HTTP PECL扩展,您可以使用http_get_request_body()
函数以stringforms获取正文数据。
如果你安装了pecl / http扩展,你也可以使用这个:
$request = new http\Env\Request(); $request->getBody();