你所不知道的 POST
0.說明
- 大叔 :二翔 我們要做一個微信公眾號哦。我來教你大概的流程好不好?(開啟裝逼模式中 )
- 二翔 :好啊,快講快講。(無限期待中 )
- 大叔 :你知道 application/x-www-form-urlencoded是什麼嘛?
- 二翔 :啊咧咧?
- 大叔 :你知道 php 怎麼獲得 raw?
- 二翔 :啊咧咧?
- 大叔 :用下面這種方法來實現。
echo file_get_contents("php://input");
- 二翔 :啊咧咧?
- 二翔 :php://input是什麼東西?
- 大叔 :嘿嘿,自己去了解吧。
1.無情浪子 POST
編故事
POST平常看起來人畜無害,但是有句話說的好。最可怕的不是鬼怪,而是人心(Content-Type)。POST在明面上,只有一個老婆叫做application/x-www-form-urlencoded,其實他一共有好幾個伴侶。
- 鍵值妹:application/x-www-form-urlencoded
- 檔案妹:multipart/form-data
-
多胞胎:raw
- text/plain
- text/html
- text/xml
- application/json
- application/xml
- application/javascirpt
2.辨別真心 Content-Type
0.說明
我們想知道POST心裡裝著的人是誰怎麼辦呢,這次請出感情專家 postman 來幫忙。
1.application/x-www-form-urlencoded
截圖
報文
POST HTTP/1.1 Host: 127.0.0.1 Cache-Control: no-cache Postman-Token: 4f2704aa-81e6-be22-4c36-8787ba945a22 Content-Type: application/x-www-form-urlencoded name=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.1 Host: 127.0.0.1 Cache-Control: no-cache Postman-Token: f7640c52-6667-b4e8-aee8-02b0e1656969 Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW ----WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; name="name" lionis ----WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; name="sex" man ----WebKitFormBoundary7MA4YWxkTrZu0gW Content-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.1 Host: 127.0.0.1 Content-Type: application/json Cache-Control: no-cache Postman-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就好了。
相關文章
- 你所不知道的cssCSS
- 你所不知道的 Transformer!ORM
- 你所不知道的JavaScript(三)JavaScript
- 你所不知道的XML安全XML
- 你所不知道的JavaScript 二JavaScript
- 你所不知道的 AI 進展AI
- 提升----你所不知道的JavaScript系列(3)JavaScript
- Python: 你所不知道的星號 * 用法Python
- 閉包—-你所不知道的JavaScript系列(4)JavaScript
- Python中你所不知道的“隱藏技巧”!Python
- 你所不知道的 C# 10新特性C#
- JavaScript中你所不知道的陣列ArrayBufferJavaScript陣列
- 你所不知道的跨域資源共享(CORS)跨域CORS
- 關於HTTP/3背後你所不知道的HTTP
- 你所不知道的阿里開源那些事兒阿里
- 你所不知道的 Chrome 控制檯除錯技巧Chrome除錯
- 你所不知道的Java效能優化之String!Java優化
- 你所不知道的Python | 字串連線的祕密Python字串
- 你所不知道的js的小知識點(1)JS
- 你所不知道的 Typescript 與 Redux 型別優化TypeScriptRedux型別優化
- 你所不知道的 CSS 陰影技巧與細節CSS
- 五個你所不知道的Flutter開發細節Flutter
- 你所不知道的Typescript與Redux型別優化TypeScriptRedux型別優化
- 你所不知道的 Python 冷知識!(建議收藏)Python
- 效能測試工具Jmeter你所不知道的內幕JMeter
- 效能測試工具LoadRunner你所不知道的內幕
- 【MySQL】你所不知道的行復制(binlog_format=row)MySqlORM
- 你所不知道的 Python 冷知識!(二)(建議收藏)Python
- 你所不知道的AWS 雲服務清單(71種)
- 你所不知道的ASP.NET Core進階系列(三)ASP.NET
- 你所不知道的Python | 函式引數的演進之路Python函式
- 你所不知道的Python | 字串格式化的演進之路Python字串格式化
- 你所不知道的用 less 檢視檔案的高階用法
- 你所不知道的前端效能優化不完全手冊前端優化
- ios蘋果企業賬號你所不知道的那些點iOS蘋果
- 關於JavaScript物件,你所不知道的事(一)- 先談物件JavaScript物件
- 他,她,他,它?深夜AI小酒館你所不知道的祕密AI
- 關於JavaScript物件,你所不知道的事(二)- 再說屬性JavaScript物件