你所不知道 ❌ PHP POST

0.說明

  • 大叔二翔 咱們要作一個微信公衆號哦。我來教你大概的流程好很差?(開啓裝逼模式中 )
  • 二翔 :好啊,快講快講。(無限期待中 )
  • 大叔 :你知道 application/x-www-form-urlencoded是什麼嘛?
  • 二翔 :啊咧咧?
  • 大叔 :你知道 php 怎麼得到 raw?
  • 二翔 :啊咧咧?
  • 大叔 :用下面這種方法來實現。
echo file_get_contents("php://input");
  • 二翔 :啊咧咧?
  • 二翔php://input是什麼東西?
  • 大叔 :嘿嘿,本身去了解吧。

<!--more-->php

1.無情浪子 POST

編故事

POST日常看起來人畜無害,可是有句話說的好。最可怕的不是鬼怪,而是人心(Content-Type)。POST在明面上,只有一個老婆叫作application/x-www-form-urlencoded,其實他一共有好幾個伴侶。html

  • 鍵值妹application/x-www-form-urlencoded
  • 文件妹multipart/form-data
  • 多胞胎rawjava

    • text/plain
    • text/html
    • text/xml
    • application/json
    • application/xml
    • application/javascirpt

2.辨別真心 Content-Type

0.說明

咱們想知道POST內心裝着的人是誰怎麼辦呢,此次請出感情專家 postman 來幫忙。git

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得到鍵值對。github

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得到鍵值對。json

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-Typeapplication/x-www-form-urlencoded 或者 multipart/form-data 的請求。app

2.HTTP_RAW_POST_DATA

$POST不能獲取的方式,都會存儲在HTTP_RAW_POST_DATA,用$GLOBALS['HTTP_RAW_POST_DATA'] 接收。給內存帶來的壓力較大,而且須要 php.ini 設置。post

3.php://input

容許讀取 POST 的原始數據。給內存帶來的壓力較小,而且不須要 php.ini 設置。不能用於 enctype="multipart/form-data"url

4.結論

php 7中已經取消了HTTP_RAW_POST_DATA,咱們平時使用$POSTphp://input就行了。

一塊兒成長

在困惑的城市裏總少不了並肩同行的 夥伴 讓咱們一塊兒成長。
  • 若是您想讓更多人看到文章能夠點個 點贊
  • 若是您想激勵小二能夠到 Github 給個 小星星
  • 若是您想與小二更多交流添加微信 m353839115

微信公衆號

本文原稿來自 PushMeTop
相關文章
相關標籤/搜索