php POST,HTTP_RAW_POST_DATA, and php://input
1、HTML <form> enctype Attribute
- application/x-www-form-urlencoded 傳送之前所有的字元都會被encoded,(spaces 被轉換為+、特殊字元被轉換為ASCII HEX)
- multipart/form-data 沒有字元被encoded,一般用upload
- text/plain Spaces被轉換為 + ,但是特殊字元不會被encoded
For example, the key-value pairs
1 2 3 |
|
are encoded as the following raw data:
1 |
|
$_POST
1 2 3 4 5 6 |
|
$HTTP_RAW_POST_DATA
1 2 |
|
php://input
1 2 3 4 |
|
2、$_POST
$_POST是最常用的獲取表單的方式,它是以關聯陣列方式組織提交的資料,並對此進行編碼處理,如urldecode,甚至編碼轉換,識別的資料型別是PHP預設識別的資料型別 application/x-www.form-urlencoded
無法解析如text/xml,application/json等非 application/x-www.form-urlencoded 資料型別的內容
3、$HTTP_RAW_POST_DATA
PHP預設識別的資料型別是application/x-www.form-urlencoded,用Content-Type=application/json 型別,提交的POST資料這時候 POST就無法獲取到了,但是使用POST就無法獲取到了,但是使用GLOBALS['HTTP_RAW_POST_DATA'] 可以獲取到。因為在PHP無法識別Content-Type的時候,就會把 POST 資料填入到 $HTTP_RAW_POST_DATA 中。
-
設定 php.ini 中的 always_populate_raw_post_data 值為 On 才會生效
-
當POST可以取到值時POST可以取到值時HTTP_RAW_POST_DATA 為空
-
不能用於 enctype="multipart/form-data"
4、php://input
php://input 可通過輸入流以檔案讀取方式取得未經處理的POST原始資料,允許讀取 POST 的原始資料。和 $HTTP_RAW_POST_DATA 比起來,它給記憶體帶來的壓力較小。
-
不需要任何特殊的 php.ini 設定
-
不能用於 enctype="multipart/form-data"
總結
1、如果是 multipart/form-data 和 application/x-www-form-urlencoded 格式 用 $_POST
2、如果不能獲取的時候比如 application/json 使用 file_get_contents('php://input')