如何在php中获取POST的主体?

2022-08-30 05:58:36

我作为POST提交到php页面以下内容:

{a:1}

这是请求的正文(POST 请求)。
在php中,我必须做些什么来提取该值?

var_dump($_POST); 

不是解决方案,不起作用。


答案 1

要访问 POST 或 PUT 请求(或任何其他 HTTP 方法)的实体正文,请执行以下操作:

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

此外,常量是 已经打开的流,因此您可以执行以下操作:STDINphp://input

$entityBody = stream_get_contents(STDIN);

I/O 流文档上的 PHP 手动条目

php://input 是一个只读流,允许您从请求正文中读取原始数据。在POST请求的情况下,最好使用 php://input 而不是因为它不依赖于特殊的php.ini指令。此外,对于默认情况下未填充的情况,它是激活always_populate_raw_post_data的内存密集程度较低的替代方法。php://input 不适用于 enctype=“multipart/form-data”。$HTTP_RAW_POST_DATA$HTTP_RAW_POST_DATA

具体来说,您需要注意,无论您如何在 Web SAPI 中访问流,该流都是不可寻道的。这意味着它只能读取一次。如果您在例行上传大型 HTTP 实体正文的环境中工作,您可能希望以流形式维护输入(而不是像上面的第一个示例那样缓冲它)。php://input

要维护流资源,如下所示可能会有所帮助:

<?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允许您管理内存消耗,因为它将在存储一定数量的数据(默认为2M)后透明地切换到文件系统存储。此大小可以在 php.ini 文件中操作,也可以通过附加 ,其中 是使用临时文件之前要保留在内存中的最大数据量(以字节为单位)。/maxmemory:NNNN

当然,除非您有充分的理由在输入流上进行搜索,否则在 Web 应用程序中不需要此功能。读取一次 HTTP 请求实体正文通常就足够了 - 不要让客户端整天等待,而你的应用会弄清楚该怎么做。

请注意,php://input 不适用于指定标头(在 HTML 表单中)的请求。这是因为 PHP 已经将表单数据解析为超全局。Content-Type: multipart/form-dataenctype="multipart/form-data"$_POST


答案 2

数组中的返回值

 $data = json_decode(file_get_contents('php://input'), true);

推荐