一、參考資料
選application/x-www-form-urlencoded還是application/json?
二、理解
1.@RequestBody的作用
注解用於將Controller的方法參數,根據HTTP Request Header的content-Type的內容,通過適當的HttpMessageConverter轉換為JAVA類
使用場景是:POST或者PUT的數據是JSON格式或者XML格式,而不是普通的鍵值對形式.
2.
application/x-www-form-urlencoded通過表單提交,在sevlet實現中,mutipart/form-data和application/x-www-form-urlencoded會被特殊處理,請求參數將被放置於request.paramter,這是一個map。
當我們使用content-type=application/json且后台使用@RequestBody,則無法再從request.paramter中獲取請求數據。
三、實際測試
1.前端js代碼
function saveDwxxBtn() { var data={ sbdw:"1", sbdwid:"2", sbsm:"3", nf:"4" } $.ajax({ type:"POST", contentType:"application/json", dataType : "json", url : 'saveZlsj', data : data, success : function(result) { }, error:function(data){} }); }
2.后台代碼
@RequestMapping(value="/saveZlsj",method=RequestMethod.POST) @ResponseBody public AjaxResult saveZlsj(ModelMap model, HttpServletRequest request, Zlsj zlsj) { AjaxResult result = new AjaxResult(); try { Integer pkid = zlService.saveZlsj(zlsj); result.setIntVal(pkid); } catch (Exception e) { e.printStackTrace(); result.setStatusCode(0); result.setMessage("操作失敗"); } return result; }
3.運行結果
1.發現Zlsj並未接收到參數,加上@RequestBody后就可以接收到參數了
2.修改js,改成序列化表單的形式提交代碼,不加@RequestBody可以接收到參數,加上@RequestBody則不能接收到參數
四、總結
如果數據是簡單、平面的key-value鍵值對,那么使用application/x-www-form-urlencoded簡單實用,不需要額外的編解碼
如果數據是復雜的嵌套關系,有多層數據,那么使用application/json會簡化數據的處理