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