文章目录
contentType与json
错误写法:(但是运行没问题)
前端:
/* 获取了表单项内容 该变量数据格式为 k1=v1&k2=v2 */
var course_update_form_info = deco deURIComponent($("#course-update-form input").serialize(),true);
/* KVtoJson方法是将k1=v1&k2=v2转换为{k1:v1,k2:v2}格式*/
var jsonData = KVtoJson(course_update_form_info);
$.ajax({
...,
data: JSON.stringify(jsonData),
contentType : "application/json",
...
});
后端:
@PostMapping("/admin/course")
public void updateCourseInfo(@RequestBody Course course){//前端传送的是json字符串 后端无法自动封装
courseService.updateCourseInfo(course);
}
正确写法:
前端:
/* 获取了表单项内容 该变量数据格式为 k1=v1&k2=v2 */
var course_update_form_info = deco deURIComponent($("#course-update-form input").serialize(),true);
$.ajax({
...,
data: course_update_form_info,
//contentType可以不写,默认值即为application/x-www-form-urlencoded
contentType : "application/x-www-form-urlencoded",
...
});
后端:
@PostMapping("/admin/course")
public void updateCourseInfo(Course course){
courseService.updateCourseInfo(course);
}
总结:
①ajax 如果发送的是json字符串,服务端接收时必须要使用@RequestBody注解。
始终记住,json字符串,"application/json”,@RequestBody 这三者之间是一一对应的,要有都有,要没有都没有。
②如果发送的是json对象,contentType不能设置为"application/json”,需使用默认的类型(application/x-www-form-urlencoded,为什么呢?这种类型最后还是会把json对象类型的参数转为user=username&pass=password这种形式后再发送,需要明白一点:这种转换时只能识别json对象类型,不能识别json字符串类型。
③简单的json对象对于application/x-www-form-urlencoded是可以处理的,因为它会把json对象转换成k1=v1&k2=v2类型;但是对于复杂的json对象,application/x-www-form-urlencoded是无法处理的,所有才有了application/json格式。
参考链接.