一開始就跟平常一樣寫好接口就給前端。發現老是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"
}