thinkphp5 post得不到值怎么辦

thinkphp5 post得不到值是因為TP5是通過strpos函數在Header的content-type值中查找app/json字符串的,其解決辦法就是設置Header的content-type值為app/json即可。

thinkphp5 post得不到值怎么辦

本教程操作環境:Windows7系統、thinkphp5版、Dell G3電腦。

thinkphp5 post得不到值怎么辦?

解決 ThinkPHP5 無法接收 客戶端 Post 傳遞的 Json 參數

這段時間在學習 API 開發,從網上搞了一個課程在跟著做,就在昨天我又一次碰到了講師一路暢通我半天調試的情況,遇到的問題是我用 postman 測試 API 某 Post 接口的時候無論怎么發送請求總是提示我參數驗證失敗,在我調試的過程中某次采用通過 Body 表傳遞參數的方法,API 神奇地通了,于是我判斷是之前 Json 傳遞出了問題,就各種在網上搜,然而并沒有解決方法[不過 Get 了兩個知識點放在文章結尾處]。

立即學習PHP免費學習筆記(深入)”;

關于 TP5 的問題度娘不行就只能查源代碼了,于是乎我就跟著錯誤一點一點的打斷點終于被我發現了問題所在~

原來 TP5 是通過 strpos 函數在 Header 的 content-type 值中查找 app/json 字符串,也就是說你必須設置 Header 的 content-type 值為 app/json 才行,否則 TP5 不會認為你傳入的是 Json 參數并給 Request::post 設值為空。

以上就解決了 TP5 無法接收 客戶端 Post 傳遞的 Json 參數的問題。

兩個知識點:

  • content-type 為 “application/json” 的數據 php 是不能直接識別的,所以導致 $_POST 數組為空。解決辦法:我們只要用 $GLOBALS[‘HTTP_RAW_POST_DATA’] 把原始數據取出來,然后再 json_decode 就行了[使用此方法,需要設置 php.ini 中的always_populate_raw_post_data 值為 On][$HTTP_RAW_POST_DATA ,包含了 POST 的原始數據。但這不是一個超全局變量,要在函數中使用它,必須聲明為 global ,或使用 $GLOBALS[‘HTTP_RAW_POST_DATA’] 代替。];

  • 可以通過 file_get_contents(‘php://input’) 代替上面的方法直接獲取到傳入的 Json 參數[我在閱讀 TP5 源碼的時候發現他們也是用這個方法來獲取的初始值]。

推薦學習:《thinkPHP視頻教程

? 版權聲明
THE END
喜歡就支持一下吧
點贊7 分享