ajax
异步提交请求常用的contentType
有两种:contentType:application/x-www-form-urlencoded
contentType:application/json
,如何使用springmvc
处理请求数据呢?
首先,我们来看一下js
对象的两种数据格式:
- 普通
js
对象,对象属性名不使用引号标注
var baseJob = {
jobName:$("#jobName").val(),
jobGroupName:$("#jobGroup").val(),
triggerName:$("#triggerName").val(),
triggerGroupName:$("#triggerGroup").val(),
cronExpression:$("#cronExpression").val(),
description:$("#description").val()
}
- 符合
json
串的js
对象,对象属性名必须用引号标注
var baseJob = {
"jobName":$("#jobName").val(),
"jobGroupName":$("#jobGroup").val(),
"triggerName":$("#triggerName").val(),
"triggerGroupName":$("#triggerGroup").val(),
"cronExpression":$("#cronExpression").val(),
"description":$("#description").val()
}
对于上面两种js
对象,在指定contentType
时,需要关注一下ajax
提交数据的格式和后端的接收方式
-
contentType:application/x-www-form-urlencoded
ajax
不指定contentType
时,默认使用的请求格式,也就是form
表单提交数据。在浏览器调试界面可以看到它是Form Data
方式提交数据,对于上面两种js
对象,后端都可以正常接收
-
contentType:application/json
+json
数据以
JSON
格式提交请求数据,在浏览器调试界面可以看到它是Request Payload
,后端必须使用@RequestBody
注解解析数据,并且前端提交的数据必须是符合json
串的js
对象。注意(使用
contentType:application/json
时):-
后端必须使用
@RequestBody
,并且只能用一个参数与前端传的数据进行匹配,否则http
请求400 -
前端提交的数据必须是符合
json
串的js
对象,如果是普通的js
对象,必须使用JSON.stringify
方法转换,也可以直接拼接参数例如:"{\"jobName\":\"123\",\"jobGroupName\":\"456\"}"
,否则参数是以key=value&key1=value1
格式传递,导致http
请求400。JSON.stringify
作用:JSON.stringify()就是把js对象,例如 var baseJob = { jobName:123, jobGroupName:456 } 转成 var baseJob = "{\"jobName\":\"123\",\"jobGroupName\":\"456\"}"
-
@RequestParam
注解不能接收application/json
的数据,只能使用@RequestBody
-
@PathVariable
注解可以使用
-
-
contentType:application/json
+ 查询字符串形式无论是
post
请求还是get
请求,后台也不用@RequestBody
注解,调用和传参是成功的。