Visual Studio Code + PHP 寫了兩個簡單的接口發現Post接口總是拿不到值,找到百度中的很多無效的信息: 1.在php.ini中把允許post的請求設置為On,很傻既然系統默認注釋了Off那么肯定默認是允許Post的.網上的很多評論都是說環境有問題,就傻傻去修改了系統中的PHP配置結果是無效的. 2.通過修改請求頭的的Content-Type 無效. 找來找去始終都沒相信是:以為這個是H5提交的事件,傳值給接口的.結果確實 php://input 看來還是需要多看書.
首先了解下《[$_POST,$HTTP_RAW_POST_DATA 和 php://input 的區別]之間的區別: <form> 標簽的 enctype 屬性: 1:application/x-www-form-urlencoded --> 默認模式,在發送到服務器之前,所有字符都會進行編碼(空格轉換為 "+" 加號,特殊符號轉換為 ASCII HEX 值 2:multipart/form-data --> 不對字符編碼,在使用包含文件上傳控件的表單時,必須使用該值。 3:text/plain --> 空格轉換為 "+" 加號,但不對特殊字符編碼。
PHP 可以用 ($_POST,$HTTP_RAW_POST_DATA 和 php://input)方式來獲取Post 數據; # 一:$_POST $_POST,是獲取表單 POST 過來數據(body部分)的最常用方法,上傳的文件信息使用 $_FILES 獲取。) # 二:$HTTP_RAW_POST_DATA 當瀏覽器從表單發送 POST 請求的時候,默認的 media type 是 "application/x-www-form-urlencoded",意思就是字段名和值都編碼了,每個 key-value 對使用 '&' 字符分隔開,key 和 value 使用 '=' 分開,並且 key 和 value 中的空格都會被替換成 + ,其他特殊字符都會被使用 urlencode 方式進行編碼。) 例子: nickname: leyangjun php num: 18 formula: a + b == 66%! nickname=leyangjun+php&num=18&formula=a+%2B+b+%3D%3D+13%25%21 PHP會解析這些原始的POST數據,並且格式化成數組,填充到 $_POST 中: Array ( [nickname] => leyangjun php [num] => 18 [formula] => a + b == 13%! ) $HTTP_RAW_POST_DATA 是 PHP 的一個預定義的變量,用來獲取原始的 POST 數據,比如上面的情況下,$HTTP_RAW_POST_DATA 的值就是:nickname=leyangjun+php&num=18&formula=a+%2B+b+%3D%3D+13%25%21; 不支持 enctype="multipart/form-data" 方式傳遞的數據,這種情況下,我們要用 $_POST 獲取字段的內容,$_FILES 來獲取上傳的文件信息 ; 需要在 php.ini 中設置開啟:always_populate_raw_post_data = On,php7后已經是-1(WarningThis feature was DEPRECATED in PHP 5.6.0, and REMOVED as of PHP 7.0.0.),被刪除了;  # 三:php://input 替代:$HTTP_RAW_POST_DATA 可以使用 php://input 來獲取原始的 POST 數據,並且 php://input 比 $HTTP_RAW_POST_DATA 更少消耗內存,當然 php://input 和 $HTTP_RAW_POST_DATA 一樣,它也不支持 enctype="multipart/form-data" 方式傳遞的數據。
由於 php://input 只是數據流,我們可以使用 file_get_contents() 函數去獲取它的內容: $post_data = file_get_contents('php://input'); print_r($post_data); 獲取到的內容和 $HTTP_RAW_POST_DATA 是一樣的。 **原始的 POST 數據有什么用**:很多時候接收到不是網頁 POST 過來的數據,而是可能通過其他方式 POST 過來的 "text/xml" 格式的數據,這些內容無法解析成 $_POST 數組,這個時候我們就需要原始的 POST 數據進行處理
# 四:總結
1、如果是 application/x-www-form-urlencoded 和 multipart/form-data 格式 用 $_POST;
2、如果不能獲取的時候比如 text/xml、application/json、soap,使用 file_get_contents('php://input');
可以愉快的開始寫接口了.
{'success': 1, 'msg': '登錄成功!', 'code': '200', 'data': {'username': 'kiwi', 'password': '123456'}}