簡體   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