解決請求介面要以JSON格式請求後端的問題
一開始就跟平常一樣寫好介面就給前端。發現老是500方法進不來發現是請求頭Content-Type的問題導致的
相關知識:
(1):我們預設使用的表單和Jquery預設的Ajax請求,Content-Type都是預設採用:application / x-www-form-urlencoded
(2):提交的資料按照username = qiu&password = 123的方式進行編碼,key和val都進行了URL轉碼,
(3):現在越來越多的人把它作為請求頭,用來告訴服務端訊息主體是序列化後的JSON字串
(4):所以在(@RequestParam(value =“token”)String token,String columnId)這樣是能獲取的到資料的
1:在@RequestMapping()中加入produce =“application / json; charset = UTF-8”設定請求頭為json格式
@RequestMapping(value = "queryDriverEvaluateById",produces = "application/json;charset=UTF-8")
@ResponseBody
發現還是500方法進不來 網上很多例子都是到這步有些就成功可以請求了,但是我的還是不行。
2:後來找到@RequestBody,來自於com.alibaba.fastjson
相關知識:
(1):@ RequestBody接收的是一個Json的物件的字串
(2):@ RequestBody需要把所有請求引數作為JSON解析,因此,不能包含鍵=值這樣的寫法在請求URL中,所有的請求引數都是一個JSON
(3):直接通過瀏覽器輸入URL時,@ RequestBody獲取不到JSON物件,需要用的Java程式設計或者基於AJAX的方法請求,將內容型別設定為應用/ JSON
在引數上寫@RequestBody JSONObject jsonObject
queryDriverEvaluateById(@RequestBody JSONObject jsonObject)
終於發現debug打斷點不在報錯了,方法進來了。
JSONObject在api中是用一個私有的常量map進行封裝的,實際就是一個map,只不過FastJson對其進行了封裝可以通過
String columnId = jsonObject.getString("columnId");
獲取到資料。有點類似於當前學習Servlet一個一個獲取引數(PS:其實就是Map鍵值對啦)。
3:雖然不在500報錯連方法都進不來了。不過這樣寫1到兩個引數還好,多了還不得累死!所以繼續去找解決辦法!
如果是多個引數,封裝成一個物件,或者本來是一個物件。
能不能通過類似於Spring MVC直接在引數上寫物件讓框架請求初始化時自動去找設定方法注入屬性值呢?
直接形參上寫
@RequestBody DriverEvaluate driverEvaluate
傳入的JSON格式字串自動轉為物件!
發現這樣是可以做到的,有一點需要注意如果請求需要通過網路傳輸在實體內需要實現Serializable序列化。
JSON傳輸的請求格式如這樣:
{
"qiujian": "112",
"password": "111",
"token": "eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJqd3312312QiLCJpYXQiOjE1NDIwOTA1MTEsInN1YiI6IntcImpwYXBpXCI6XCJqcCFAI1wifSIsImV4cCI6MTU0MjA5MjMxMX0.Jr6LZHMF4i-4aWby7V6GFDKodV11fak-Vzgx-n9Wls0"
}