php使用file_get_contents(‘php://input‘)和$_POST的區別實例對比
本文學習目的:
為什麼和第三方平臺對接接口的時候,在接收http請求數據包時,一般都是用file_get_contents(“php://input”),而不是用$_POST呢?
file_get_contents:將整個文件讀入一個字符串
在用php寫接口的時候,通常會將請求的數據通過json的形式發送到指定的請求地址處,此時的file_get_contents(‘php://input’)主要是用來獲取請求的原始數據。和 $HTTP_RAW_POST_DATA 比起來,php://input給內存帶來的壓力較小,並且不需要任何特殊的 php.ini 設置。
註意兩點:
數據的提交方式應為POSTphp://input 不能用於接收enctype=”multipart/form-data”表單提交的數據
1、舉一個簡單示例:
提交表單
<form action="" method="POST"> 姓名: <input type="text" name="name" value="tom" /><br /> 年齡:<input type="text" name="age" value="22" /><br /> <input type="submit" value="Submit" /> </form>
後端控制器通過file_get_contents(‘php://input’),獲取請求原始數據流
<?php $content = file_get_contents('php://input', 'r'); echo $content; //輸出name=tom&age=22 ?>
2、在項目應用中,如攝像頭拍照,上傳保存,就可以用到php://input。客戶端拍照後,把圖片流傳送到服務端,服務端使用file_get_getcontents(‘php://input’)就能獲取到圖片流。
$_POST
$_POST隻能接收Content-Type: application/x-www-form-urlencoded提交的數據,php會將http請求body相應數據填入到數組_POST中,_POST數組中的數據是進行urldecode()解析的結果。除瞭該Content-Type,還有 multipart/form-data類型的表單數據也可以用$_POST接收。
四種常見的提交數據方式,分別如下:
定義和用法
enctype 屬性規定在發送到服務器之前應該如何對表單數據進行編碼。默認地,表單數據會編碼為 “application/x-www-form-urlencoded”。就是說,在發送到服務器之前,所有字符都會進行編碼(空格轉換為 “+” 加號,特殊符號轉換為 ASCII HEX 值)。
enctype屬性值
Content-Type值 | 描述 |
---|---|
application/x-www-form-urlencoded | 在發送前編碼所有字符(默認) |
multipart/form-data |
不對字符編碼。 在使用包含文件上傳控件的表單時,必須使用該值。 |
text/plain | 空格轉換為 “+” 加號,但不對特殊字符編碼。 |
text/xml |
一種使用 HTTP 作為傳輸協議,XML 作為編碼方式的遠程調用規范。 |
總結:
1、Coentent-Type僅在取值為application/x-www-data-urlencoded和multipart/form- data兩種情況下,PHP才會將http請求數據包中相應的數據填入全局變量$_POST中。
2、PHP不能識別的Content-Type類型的時候,會將http請求包中相應的數據填入變量$HTTP_RAW_POST_DATA中。
3、隻有Coentent-Type為multipart/form-data的時候,PHP才不會將http請求數據包中的相應數據填入php: //input,否則其它情況都會。填入的長度,由Coentent-Length指定。
4、隻有Content-Type為application/x-www-data-urlencoded時,php://input數據才跟$_POST數據相一致。
5、如果不能獲取的時候,比如Coentent-Type為text/xml、application/json、soap,請使用 file_get_contents(‘php://input’);
到此這篇關於php使用file_get_contents(‘php://input‘)和$_POST的區別實例對比的文章就介紹到這瞭,更多相關php使用file_get_contents和$_POST內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 對Golang中的FORM相關字段理解
- JQuery異步post上傳表單數據標準化模板
- 使用flask如何獲取post請求參數
- 使用Spring處理x-www-form-urlencoded方式
- Go語言實現文件上傳