1. 问题描述
使用$.ajax传json数据时,发现后端一直提示没有收到参数,最终通过修改contentType(发送数据类型)使得后端接收数据正常。
2.代码
后端代码:使用@RequestParam接收参数
@RequestMapping(value = "/login",method = RequestMethod.POST)
public String login(@RequestParam(value = "account",required = false) String account,@RequestParam(value = "password",required = false) String password){
//······
}
JS代码:原ajax请求
$.ajax({
type: "POST",
dataType: "json", //数据类型
contentType: "application/json",
url: "xxxxxxxxxxxx" , //请求地址
data: {
"account":"abcdefg",
"password":"123456"
},
success: function (result) {
console.log(result); //打印服务端返回的数据(调试用)
if (result.resultCode == 200) {
//TODO
};
},
error : function(res) {
console.log(res); //打印服务端返回的数据(调试用)
alert("异常");
},
});
3.原因分析
- @RequestParam
用来处理Content-Type: 为 application/x-www-form-urlencoded编码的内容。(Http协议中,如果不指定Content-Type,则默认传递的参数就是application/x-www-form-urlencoded类型) - @RequestBody
处理HttpEntity传递过来的数据,一般用来处理非Content-Type: application/x-www-form-urlencoded编码格式的数据。
– GET请求中,因为没有HttpEntity,所以@RequestBody并不适用。
– POST请求中,通过HttpEntity传递的参数,必须要在请求头中声明数据的类型Content-Type,SpringMVC通过使用HandlerAdapter 配置的HttpMessageConverters来解析HttpEntity中的数据,然后绑定到相应的bean上。
解决方法一:前端将ajax的contentType参数改为x-www-form-urlencoded
解决方法二:后端使用@RequestBody来获取参数
4.修改后结果(使用方法一)
修改前请求结果(返回400状态码):
修改后请求结果(返回200状态码):