echo file_get_contents("php://input");
二翔 :啊咧咧?
二翔 :php://input是什麼東西?
大叔 :嘿嘿,自己去了解吧。
1.無情浪子 POST 編故事POST平常看起來人畜無害,但是有句話說的好。最可怕的不是鬼怪,而是人心(Content-Type)。POST在明面上,只有一個老婆叫做application/x-www-form-urlencoded,其實他一共有好幾個伴侶。
2.辨別真心 Content-Type 0.說明我們想知道POST心裡裝著的人是誰怎麼辦呢,這次請出感情專家 postman 來幫忙。
1.application/x-www-form-urlencoded截圖
報文
POST HTTP/1.1Host: 127.0.0.1Cache-Control: no-cachePostman-Token: 4f2704aa-81e6-be22-4c36-8787ba945a22Content-Type: application/x-www-form-urlencodedname=lionis&sex=man
服務端代碼
<?php var_dump($_POST);
輸出
array(2) { ["name"]=> string(6) "lionis" ["sex"]=> string(3) "man"}
結論
application/x-www-form-urlencoded是常用的表單發包方式,普通的表單提交,默認都是通過這種方式。 對於PHP用$_POST獲得鍵值對。
2.multipart/form-data截圖
報文
POST HTTP/1.1Host: 127.0.0.1Cache-Control: no-cachePostman-Token: f7640c52-6667-b4e8-aee8-02b0e1656969Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW----WebKitFormBoundary7MA4YWxkTrZu0gWContent-Disposition: form-data; name="name"lionis----WebKitFormBoundary7MA4YWxkTrZu0gWContent-Disposition: form-data; name="sex"man----WebKitFormBoundary7MA4YWxkTrZu0gWContent-Disposition: form-data; name="avater"; filename=""Content-Type: ----WebKitFormBoundary7MA4YWxkTrZu0gW
服務端代碼
<?php var_dump($_POST); var_dump($_FILES);
輸出
array(2) { ["name"]=> string(6) "lionis" ["sex"]=> string(3) "man"}array(1) { ["avater"]=> array(5) { ["name"]=> string(36) "0CD0A5235EDCDAAB4AFE05B25695E696.png" ["type"]=> string(9) "image/png" ["tmp_name"]=> string(45) "/Applications/XAMPP/xamppfiles/temp/phpeFfc9e" ["error"]=> int(0) ["size"]=> int(9485) }}
結論
multipart/form-data 用在發送文件的POST包。對於PHP用$_FILE獲取文件內容,用$_POST獲得鍵值對。
3.raw截圖
報文
POST HTTP/1.1Host: 127.0.0.1Content-Type: application/jsonCache-Control: no-cachePostman-Token: 9e0c339b-a6b0-c534-5c62-63ef8dc887c4{ "user": "xieyuandong", "sex": "man"}
服務端代碼
<?php var_dump(file_get_contents('php://input'));
輸出
string(47) "{ "user": "xieyuandong", "sex": "man"}"
結論
raw可以上傳json,xml,文本等等。對於PHP用php://input獲得內容。
3.$_POST vs php://input vs HTTP_RAW_POST_DATA 1.$_POST可以獲 Content-Type 為 application/x-www-form-urlencoded 或者 multipart/form-data 的請求。
2.HTTP_RAW_POST_DATA$POST不能獲取的方式,都會存儲在HTTP_RAW_POST_DATA,用$GLOBALS['HTTP_RAW_POST_DATA'] 接收。給內存帶來的壓力較大,並且需要 php.ini 設置。
3.php://input允許讀取 POST 的原始數據。給內存帶來的壓力較小,並且不需要 php.ini 設置。不能用於 enctype="multipart/form-data"。
4.結論在php 7中已經取消了HTTP_RAW_POST_DATA,我們平時使用$POST和php://input就好了。
via:https://github.com/zhangxiangliang/your-dont-know-series/blob/master/your-dont-know-post.md