天天看點

PHP——$_POST、$HTTP_RAW_POST_DATA和php://input的差別

  在進行資料傳輸和資料互動時,經常需要擷取他人傳輸來的資料,這時一般會有三種方法提供給我們來進行資料的擷取,現在來簡單介紹一下這三種方法的差別。

1.$_post

  這是我們在資料互動時常用的一種方法,但對于接收json格式的資料而言顯然是行不通的,具體原因在于post是以關聯數組方式組織送出的資料,并對此進行編碼處理,如urldecode,甚至編碼轉換,識别的資料類型是PHP預設識别的資料類型application/x-www.form-urlencoded和multipart/form-data,無法解析如text/xml,application/json等非application/x-www.form-urlencoded 資料類型的内容。

2.$HTTP_RAW_POST_DATA

  PHP預設識别的資料類型是application/x-www.form-urlencoded,當Content-Type=application/json類型時無法通過 $_POST擷取,但是使用 GLOBALS[‘HTTP_RAW_POST_DATA’]可以擷取到。因為在PHP無法識别Content-Type的時候,就會把 POST 資料填入HTTP_RAW_POST_DATA 中。但這種方法需要設定 php.ini 中的 always_populate_raw_post_data 值為 On 才會生效,且當POST 與php://input可以取到值時 $HTTP_RAW_POST_DATA 為空,當enctype="multipart/form-data"時也無法使用。注意:PHP7中已經移除了這個全局變量,用 php://input 替代

3.php://input

  隻有在Coentent-Type為multipart/form-data的時候,PHP不會将http請求資料包中的相應資料填入php://input,否則其它情況都會。填入的長度,由Coentent-Length指定。且隻有Content-Type為application/x-www-data-urlencoded時,php://input資料才跟$_POST資料相一緻(格式不一緻,内容一緻)。

舉個例子說明一下。

<?php
var_dump(http_build_query($_POST));
var_dump(file_get_contents("php://input"));
var_dump($HTTP_RAW_POST_DATA);
?>
<form method="post">
年齡:<input name="age" type="text" />
<input name="submit" type="submit" />
</form>
           

輸入24之後的結果為:

PHP——$_POST、$HTTP_RAW_POST_DATA和php://input的差別

從例一我們可以得出以下結論:

1、通常情況下,http_build_query($_POST) =  file_get_contents("php://input"),但是Content-Type僅在取值為application/x-www-data-urlencoded和multipart/form-data兩種情況下,PHP才會将http請求資料包中相應的資料填入全局變量$_POST,而如果用戶端向伺服器post的資料是xml等格式時,$_POST是接收不了的,這種情況下隻能用php://input或者是$HTTP_RAW_POST_DATA來接收。

2、$HTTP_RAW_POST_DATA依賴于php.ini檔案中對于always_populate_raw_post_data參數的配置,如例一所示,在該參數設定為off的情況下,$HTTP_RAW_POST_DATA為null,其次,$HTTP_RAW_POST_DATA已在php5.6版本中廢棄,官方建議使用php://input替代$HTTP_RAW_POST_DATA。使用php://input比激活 always_populate_raw_post_data 潛在需要更少的記憶體。

<?php
var_dump(http_build_query($_POST));
var_dump(file_get_contents("php://input"));
var_dump($HTTP_RAW_POST_DATA);
?>
<form method="post" enctype="multipart/form-data">
年齡:<input name="age" type="text" />
<input name="submit" type="submit" />
           

輸入24之後的結果為:

PHP——$_POST、$HTTP_RAW_POST_DATA和php://input的差別

可以看出,當enctype="multipart/form-data" 的時候 php://input 是無效的。

Tips:關于enctype=multipart/form-data的意義,就是将該次http請求頭部(head)中的Content-Type設定為multipart/form-data。multipart/form-data也表示以POST方法送出表單資料,它還伴随了檔案上傳,是以會跟application/x-www-form-urlencoded資料格式不一樣。它會以一更種更合理的,更高效的資料格式傳遞給服務端。

本文參考文章連結:https://blog.csdn.net/huangjingwen1129/article/details/82858573

https://blog.csdn.net/u011250882/article/details/47188883