你所不知道的 POST

zhangxiangliang發表於2018-04-21

 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就好了。

相關文章