1. 程式人生 > >php獲取body體,file_get_contents("php://input")

php獲取body體,file_get_contents("php://input")

最近遇到接到個專案,需要獲取原生態的body體,於是很疑惑,php可以獲取引數,但是怎麼獲取body體?
查閱了php手冊,發現了:file_get_contents(“php://input”),使用者獲取body體。
但是為什麼這種方式能夠獲取body體,是個什麼樣的邏輯?我們深入探究下PHP輸入流php://input。
對於php://input介紹,PHP官方手冊文件有一段話對它進行了很明確地概述。

“php://input allows you to read raw POST data. It is a less memory intensive alternative to $HTTP_RAW_POST_DATA and does not need any special php.ini directives. php://input is not available with enctype=”multipart/form-data”.

翻譯後如下:

php://input可以讀取沒有處理過的POST資料。相較於$HTTP_RAW_POST_DATA而言,它給記憶體帶來的壓力較小,並且不需要特殊的php.ini設定。php://input不能用於enctype=multipart/form-data”

我們應該怎麼去理解這段概述呢?我把它劃分為三部分,逐步去理解:

讀取POST資料
不能用於multipart/form-data型別
php://input 跟 $HTTP_RAW_POST_DATA的比較

不過我通過程式碼對比總結,得出結果如下:
1.Coentent-Type為application/x-www-data-urlencoded和multipart/form-data兩種情況下,PHP會將請求資料傳遞給$_POST
2.PHP不能識別的Content-Type型別的時候,會將http請求包中相應的資料填入變數$HTTP_RAW_POST_DATA

.
3, 只要Content-Type不為multipart/form-data的時候,PHP將不會把http請求body體資料填入php://input,否則其它情況都會。填入的長度,由Content-Length指定。
4,只有Content-Type為application/x-www-data-urlencoded時,php://input資料才跟$_POST資料相一致。
5,php://inputHTTPRAWPOSTDATA.php://inputHTTP_RAW_POST_DATA更效率,並不需要配置php.ini
6.http請求的,GET形式下,body體為空。