一、参考资料
选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会简化数据的处理