注解 | 支持的类型 | 支持的请求类型 | 支持的Content-Type | 请求示例 |
---|---|---|---|---|
@PathVariable | url | GET | 所有 | /test/{id} |
@RequestParam | url | GET | 所有 | /test?id=1 |
@RequestBody | Body | POST/PUT/DELETE/PATCH | json | {“id”:1} |
复杂参数接收,功能实现
单个参数就写个属性
有角标数组的就写个集合
参数用对象的就
在对象中再建立一个对象
POST
@RequestParam
接收JSON对象
function testPost() {
var queryData = {
jflb: "测试spring MVC 的参数接收!",
zlay: "xxxxx",
bir: new Date(),
ysCode: ["0123", "4567"]
}
$.ajax({
type: 'post',
url: '/mvc/queryTests',
data: queryData,
dataType: "json",
success: function (data) {
console.log(data);
}
});
}
后台 使用 @RequestParam
@PostMapping(value = "/queryTests", produces = MediaType.ALL_VALUE)
public String queryActionByDisputes(@RequestParam String jflb, @RequestParam String zlay,
@RequestParam(value = "ysCode[]") String[] ysCode,@RequestParam Date bir) {
System.err.println(jflb + zlay + Arrays.toString(ysCode)+bir);
return "SUCCESS";
}
@RequestBody
只能接收JSON字符串,因此 Content-Type需要更改,同时 data也要更改
function testPost() {
var queryData = {
name: "测试spring MVC 的参数接收!",
info: "xxxxx",
bir: new Date(),
arrCode: ["0123", "4567"]
}
var queryUrl = '/mvc/queryTest'
$.ajax({
type: 'post',
url: queryUrl,
data: JSON.stringify(queryData),
contentType: 'application/json;charset=UTF-8',
dataType: "json",
success: function (data) {
console.log(data);
}
});
}
后台 使用 @RequestBody
@PostMapping(value = "/queryTest", produces = MediaType.ALL_VALUE)
public String queryActionByDispute(@RequestBody Map<String, Object> queryMape) {
System.err.println(queryMape);
return "SUCCESS";
}
// 自定义VO
public class McVO {
// 省略 getter setter
private String name;
private String info;
private Date bir;
private List<String> arrCode;
}
@PostMapping(value = "/queryTest", produces = MediaType.ALL_VALUE)
public void useVo(@RequestBody McVO vo) { }
接收List&Array
let array = []
for (let index = 0; index < 10; index++) {
array.push({
id:index,
name:'uuid'+index,
username:'hello-->'+new Date()+"",
age:index*8
})
}
var queryUrl = '/info'
$.ajax({
type: 'post',
url: queryUrl,
contentType: 'application/json;charset=UTF-8',
data:JSON.stringify(array),
dataType: "json",
success: function (data) {
console.log(data);
}
});
// 另一种方式 可以携带多余的数据 , 例如 token
$.ajax({
//默认传输的内容类型为 key-value 型,后台使用数组、List 接收参数时,
// headers 中必须指定内容类型为 json 类型,否则会报415错误
headers: {
'Content-Type': 'application/json;charset=utf8',
'TOKEN':'UUID_RE_KEY_89898078'
},
type: "post",
url: "http://localhost:8080/user/save5",
//指定 json 类型后,传输的数据理所当然应该是 json 格式。
data: JSON.stringify(data),
success: function (data) {
console.log(data);
},
error: function (data) {
console.log("ERROR:" + JSON.stringify(data));
}
});
后台使用 @Requestbody
@ResponseBody
@RequestMapping(value = "info")
public ResultBean info(@RequestBody List<User> user) {
return ResultBean.ok().put("token", UUID.randomUUID().toString()).put("request", user);
}
get请求
(接收JSON对象、对象中包含数组)
function testPost() {
var queryData = {
info: "测试spring MVC 的参数接收!",
name: "xxxxx",
bir: new Date(),
arrCode: ["0123", "4567"]
}
var queryUrl = '/mvc/queryTests'
$.ajax({
type: 'get',
url: queryUrl,
data: queryData,
dataType: "json",
success: function (data) {
console.log(data);
}
});
}
@GetMapping(value = "/queryTests", produces = MediaType.ALL_VALUE)
public String queryActionByDisputes(@RequestParam String info, @RequestParam String name,
@RequestParam(value = "arrCode[]") List<String> arrCode,@RequestParam Date bir) {
System.err.println(info + name + (arrCode)+bir);
return "SUCCESS";
}
@RequestParam POST请求 @RequestParam:
用来处理(前端)Content-Type: 为 application/x-www-form-urlencoded或者form-data编码的内容
该注解有两个属性: value、required; value用来指定要传入值的id名称,required用来指示参数是否必须绑定; 注意这里Headers里不能以application/json作为Content-type,否则后台也接收不到请求
- @RequestParam 来自于requestHeader中,即请求头,
- 但是却不是JSON,这个一般就是在ajax里面没有声明(别人调用)contentType的时候,为默认的
@RequestBody
- 该注解常用来处理Content-Type: 不是
application/x-www-form-urlencoded
编码的内容,例如application/json, application/xml等; 前端规定的是raw方式,那么就需要使用@RequestBody接收参数,注意这里Headers里需要以application/json作为Content-type
@Requestbody 来自于requestBody
中,即请求体中。当前端或者别人传入JSON数据给你时,使用此注解,就已将传入给你的字段或者属性将与你所创建的实体类绑定到一起,不相信的可以Debug测试看看传入参数是否在这个实体里面。
注意事项
@RequestParam | @RequestBody |
---|---|
contentType:‘application/x-www-form-urlencoded’ 可以不用定义,contentType默认值 | contentType: 'application/json;charset=UTF-8' 必须定义,处理非Content-Type: application/x-www-form-urlencoded编码格式的数据 |
GET、POST | POST |
处理地址栏传递过来的数据 | 处理HttpEntity传递过来的数据 |
可以接收JSON字符串,也可以接收JSON对象 | 只接收JSON字符串 |
- 未定义Content-type的类型
Jquery默认使用application/x-www-form-urlencoded
类型(application/x-www-form-urlencoded
把JSON对象数据转换成一个字串)。那么意思就是SpringMVC的@RequestParam注解,Servlet的request.getParameter是可以接受到以这种格式传输的JSON对象的。
使用@RequestBody注解
前台的Content-Type必须要改为
application/json
,如果没有更改,前台会报错415(Unsupported Media Type)。后台日志就会报错Content type ‘application/x-www-form-urlencoded;charset=UTF-8’ not supported前台报400的错:原因:GET方式添加了contentType: 'application/json;charset=UTF-8'
@RequestParam 它的作用和我们Servlet中的request.getParameter是基本相同的
传递数组:
(1)post请求,JSON对象传递,@RequestParam 接收
最重要:@RequestParam接收的参数说明是数组 @RequestParam("ysCode[]") List<String> ysCode
(2)post请求 JSON字符串传递 @RequestBody接收
(3)get请求,JSON对象传递,@RequestParam 接收
最重要:@RequestParam接收的参数说明是数组 @RequestParam("ysCode[]") List<String> ysCode
(4)post请求 JSON字符串传递 @RequestParam 接收
- @RequestParam,是获取前端传递给后端的参数,可以是get方式,也可以是post方式。其中如果前端传递的参数和后端你接受的参数起的名字字段是一致的可以省略不写,也可以直接写 @RequestParam String title ,如果不一致一定要完整写,不然获取不到
Content-Type
常见的媒体格式类型如下 | 以application开头的媒体格式类型 | 媒体格式是上传文件 |
---|---|---|
text/html : HTML格式 text/plain :纯文本格式 text/xml : XML格式 image/png:png图片格式 | application/xhtml+xml :XHTML格式 application/xml : XML数据格式 application/atom+xml :Atom XML聚合格式 application/json : JSON数据格式 application/pdf :pdf格式 application/msword : Word文档格式 application/octet-stream : 二进制流数据(如常见的文件下载) application/x-www-form-urlencoded : form 表单 encType="" 中默认的encType,form表单数据被编 码 为key/value格式发送到服务器(表单默认的提交数据的格式) | multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式 |