繁体   English   中英

如何在php中获取POST的正文?

[英]How to get body of a POST in php?

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

{a:1}

这是请求的主体(POST 请求)。
在 php 中,我该怎么做才能提取该值?

var_dump($_POST); 

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

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

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

此外, STDIN常量是php://input一个已经打开的流,因此您可以选择执行以下操作:

$entityBody = stream_get_contents(STDIN);

来自I/O 流文档PHP 手册条目

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

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

为了维护流资源,这样的事情可能会有所帮助:

<?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:NN来操作此大小,其中NN是在使用临时文件之前保留在内存中的最大数据量,以字节为单位。

当然,除非您有充分的理由在输入流上查找,否则您不应该在 Web 应用程序中需要此功能。 读取 HTTP 请求实体主体一次通常就足够了——不要让客户端在你的应用程序弄清楚要做什么时整天等待。

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

数组中的返回值

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

$_POST为空的一个可能原因是请求不是POST ,或者不再是POST ......它可能以 post 开始,但在某处遇到了301302重定向,然后切换到GET

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

请参阅https://stackoverflow.com/a/19422232/109787以很好地讨论为什么这不应该发生但仍然发生。

function getPost()
{
    if(!empty($_POST))
    {
        // when using application/x-www-form-urlencoded or multipart/form-data as the HTTP Content-Type in the request
        // NOTE: if this is the case and $_POST is empty, check the variables_order in php.ini! - it must contain the letter P
        return $_POST;
    }

    // when using application/json as the HTTP Content-Type in the request 
    $post = json_decode(file_get_contents('php://input'), true);
    if(json_last_error() == JSON_ERROR_NONE)
    {
        return $post;
    }

    return [];
}

print_r(getPost());

这是如何使用file_get_contents("php://input")创建 php api 并在javascript使用ajaxXMLHttpRequest

var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function () {
        if (this.readyState == 4 && this.status == 200) {
    console.log("done");
            }
        }
    };
    xhttp.open("POST", "http://127.0.0.1:8000/api.php", true);
    xhttp.send(JSON.stringify({
        username: $(this).val(),
        email:email,
        password:password
    }));

$data = json_decode(file_get_contents("php://input"));
$username  =  $data->username;
$email  =   $data->email;
$password  =   $data->password;

如果您安装了 HTTP PECL 扩展,您可以使用http_get_request_body()函数以字符串形式获取正文数据。

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

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

http_get_request_body()是根据文档http://php.net/manual/fa/function.http-get-request-body.php明确用于获取PUTPOST请求的正文

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM