寫php這么些年了,好多知識點都沒有總結,來記錄一下。畢竟日拱一卒無有盡,功不唐捐終入海。
用php來做APP的接口開發,但是在用postman模擬提交數據的時候$_POST
、$_REQUEST
都獲取不到json數據,只能使用file_get_contents('php://input')
查過資料后發現,原來PHP默認只識別application/x-www.form-urlencoded
標准的數據類型,對如text/xml或者 soap 或者 application/octet-stream
之類的內容無法解析,如果用$_POST
數組來接收就會失敗,但保留了原型,交給$GLOBALS['HTTP_RAW_POST_DATA']
來接收。
正確的姿勢是這樣的:
將postman請求頭設置為 Content-Type: application/json; charset=utf-8
,向php發起請求
第一種方法
// 這樣php就接收到postman發送過來的json值了
$response = json_decode(file_get_contents('php://input'), true);
第二種方法
// 這樣php就接收到postman發送過來的json值了
$response = $GLOBALS['HTTP_RAW_POST_DATA'];
使用$HTTP_RAW_POST_DATA
,需要設置php.ini中的always_populate_raw_post_data值為On。
它包含了POST的原始數據。但這不是一個超全局變量,要在函數中使用它,必須聲明為global,或使用$GLOBALS['HTTP_RAW_POST_DATA']代替。
php://input 允許讀取 POST 的原始數據,但和 $GLOBALS['HTTP_RAW_POST_DATA'] 比起來,它給內存帶來的壓力較小,並且不需要任何特殊的 php.ini 設置。
這兩種方法都 不能用於 enctype="multipart/form-data"。