thinkphp5 post得不到值是因為TP5是通過strpos函數(shù)在Header的content-type值中查找app/json字符串的,其解決辦法就是設(shè)置Header的content-type值為app/json即可。
本教程操作環(huán)境:Windows7系統(tǒng)、thinkphp5版、Dell G3電腦。
thinkphp5 post得不到值怎么辦?
解決 ThinkPHP5 無法接收 客戶端 Post 傳遞的 Json 參數(shù)
這段時間在學(xué)習(xí) API 開發(fā),從網(wǎng)上搞了一個課程在跟著做,就在昨天我又一次碰到了講師一路暢通我半天調(diào)試的情況,遇到的問題是我用 postman 測試 API 某 Post 接口的時候無論怎么發(fā)送請求總是提示我參數(shù)驗證失敗,在我調(diào)試的過程中某次采用通過 Body 表傳遞參數(shù)的方法,API 神奇地通了,于是我判斷是之前 Json 傳遞出了問題,就各種在網(wǎng)上搜,然而并沒有解決方法[不過 Get 了兩個知識點(diǎn)放在文章結(jié)尾處]。
立即學(xué)習(xí)“PHP免費(fèi)學(xué)習(xí)筆記(深入)”;
關(guān)于 TP5 的問題度娘不行就只能查源代碼了,于是乎我就跟著錯誤一點(diǎn)一點(diǎn)的打斷點(diǎn)終于被我發(fā)現(xiàn)了問題所在~
原來 TP5 是通過 strpos 函數(shù)在 Header 的 content-type 值中查找 app/json 字符串,也就是說你必須設(shè)置 Header 的 content-type 值為 app/json 才行,否則 TP5 不會認(rèn)為你傳入的是 Json 參數(shù)并給 Request::post 設(shè)值為空。
以上就解決了 TP5 無法接收 客戶端 Post 傳遞的 Json 參數(shù)的問題。
兩個知識點(diǎn):
-
content-type 為 “application/json” 的數(shù)據(jù) php 是不能直接識別的,所以導(dǎo)致 $_POST 數(shù)組為空。解決辦法:我們只要用 $GLOBALS[‘HTTP_RAW_POST_DATA’] 把原始數(shù)據(jù)取出來,然后再 json_decode 就行了[使用此方法,需要設(shè)置 php.ini 中的always_populate_raw_post_data 值為 On][$HTTP_RAW_POST_DATA ,包含了 POST 的原始數(shù)據(jù)。但這不是一個超全局變量,要在函數(shù)中使用它,必須聲明為 global ,或使用 $GLOBALS[‘HTTP_RAW_POST_DATA’] 代替。];
-
可以通過 file_get_contents(‘php://input’) 代替上面的方法直接獲取到傳入的 Json 參數(shù)[我在閱讀 TP5 源碼的時候發(fā)現(xiàn)他們也是用這個方法來獲取的初始值]。
推薦學(xué)習(xí):《thinkPHP視頻教程》