最近自己在做项目的时候,前后端一起做,在发请求时,愣是搞不清楚该怎么传递参数,参数位置到底应该放在哪。所以我决定整理一下SpringMVC的参数传递,相信大家一定遇到过类似的问题。如果能够帮助到你,那是我的荣幸!这里前端使用axios(最常用的请求工具库)来发起请求,文章中还使用到了其他的第三方库,例如qs库,请注意!
1.Get请求
(1)普通参数接收
1.请求url
2.前端请求代码
<script>
const request = axios.create({
baseURL: 'http://127.0.0.1:8080/api',
timeout: 1000,
});
let params = {
name: 'aDong',
age: 20
}
const res = request.get('/delete', {
params
})
</script>
3.后端接收代码
@RestController
@RequestMapping("/api")
public class BasicController {
@GetMapping("/delete")
public String getUserName(@RequestParam( "name") String userName, String age) {
System.out.println("Get 普通参数接收 =>" + userName + " - " + age);
return "delete:ok";
}
}
(2)Pojo参数接收
1.请求url
http://localhost:8080/api/delete?name=aDong&age=20
2.前端请求代码
<script>
const request = axios.create({
baseURL: 'http://127.0.0.1:8080/api',
timeout: 1000,
});
let params = {
name: 'aDong',
age: 20
}
const res = request.get('/get', {
params
})
</script>
3.后端接收代码
@GetMapping("/get")
public String getUserName(User user) {
System.out.println("Get 普通参数接收 =>" + user.getName() + " - " + user.getAge());
return "ok";
}
//User类单独放在一个文件里
public class User {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
(3)数组参数接收
1.请求url
2.前端请求代码
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<!-- 引入qs -->
<script type="text/javascript" src="https://cdn.bootcss.com/qs/6.7.0/qs.min.js"></script>
</head>
<body>
</body>
<script>
var qs = Qs
const request = axios.create({
baseURL: 'http://127.0.0.1:8080/api',
timeout: 1000,
});
let likes = ['a', 'b', 'c']
//----第一种方式借助qs库拼接
//请求路径
// request.get('/get' + '?' + qs.stringify({ likes }, { arrayFormat: 'repeat' }))//get?likes=a&likes=b&likes=c,正常接收
// request.get('/get' + '?' + qs.stringify({ likes }, { arrayFormat: 'indicate' }))//get?likes%5B0%5D=a&likes%5B1%5D=b&likes%5B2%5D=c,这种方式后端接收不到参数
// request.get('/get' + '?' + qs.stringify({ likes }, { arrayFormat: 'brackets' }))//get?likes%5B%5D=a&likes%5B%5D=b&likes%5B%5D=c,这种方式后端也接收不到参数
// request.get('/get' + '?' + qs.stringify({ likes }, { arrayFormat: 'comma' }))//get?likes=a%2Cb%2Cc,正常接收
//----第二种方式axios配置,
request.get('/get', {
params:{
likes
},
paramsSerializer: function (params) {
return qs.stringify(params, { arrayFormat: 'repeat' })
},
})
</script>
</html>
3.后端接收代码
@GetMapping("/get")
public String getUserName(String[] likes) {
System.out.println("Get 数组参数接收 =>" + Arrays.toString(likes));
return "ok";
}
(4)集合参数接收
1.请求url
http://127.0.0.1:8080/api/get?&likes=a&likes=b&likes=c
2.前端请求代码
<script>
var qs = Qs
const request = axios.create({
baseURL: 'http://127.0.0.1:8080/api',
timeout: 1000,
});
let likes = ['a', 'b', 'c']
//----第一种方式借助qs库拼接
//请求路径
// request.get('/get' + '?' + qs.stringify({ likes }, { arrayFormat: 'repeat' }))//get?likes=a&likes=b&likes=c,正常接收
// request.get('/get' + '?' + qs.stringify({ likes }, { arrayFormat: 'indicate' }))//get?likes%5B0%5D=a&likes%5B1%5D=b&likes%5B2%5D=c,这种方式后端接收不到参数
// request.get('/get' + '?' + qs.stringify({ likes }, { arrayFormat: 'brackets' }))//get?likes%5B%5D=a&likes%5B%5D=b&likes%5B%5D=c,这种方式后端也接收不到参数
// request.get('/get' + '?' + qs.stringify({ likes }, { arrayFormat: 'comma' }))//get?likes=a%2Cb%2Cc,正常接收
//----第二种方式axios配置,
request.get('/get', {
params:{
likes
},
paramsSerializer: function (params) {
return qs.stringify(params, { arrayFormat: 'repeat' })
},
})
</script>
3.后端接收代码
@GetMapping("/get")
public String getUserName(@RequestParam List<String> likes) {
System.out.println("Get 集合参数接收 =>" + likes);
return "ok";
}
(5)JSON参数接收
1.请求url
2.Postman
前端的get和head请求不能携带body参数
大致意思时如果请求方法是
GET
或HEAD
,那么body
会被忽略的
但是postman工具是可以的,因为Postman工具没有遵循标准
3.后端接收代码
@GetMapping("/get")
public String getUserName(@RequestBody List<String> likes) {
System.out.println("Get 集合参数接收 =>" + likes);
return "ok";
}
(6)JSON格式POJO参数接收
1.请求url
http://localhost:8080/api/get
2. Postman
3. 后端接收代码
@GetMapping("/get")
public String getUserName(@RequestBody User user) {
System.out.println("Get JsonPojo参数接收 =>" + user.toString());
return "ok";
}
(7)JSON格式集合Pojo参数
1.请求url
http://localhost:8080/api/get
2.Postman
3.后端接收代码
@GetMapping("/get")
public String getUserName(@RequestBody List<User> user) {
System.out.println("Get JsonPojo参数接收 =>" + user.toString());
return "ok";
}
(8)日期类型参数接收(一)
1.请求url
2.前端请求代码
<script>
const request = axios.create({
baseURL: 'http://127.0.0.1:8080/api',
timeout: 1000,
});
console.log(Date.now())
request.get('/get',{
params:{
date:new Date()
}
} )
</script>
3.后端接收代码
一定不要忘记加上@DateTimeFormat注解并且一旦使用yyyy-MM-dd
格式,如果传时分秒就会报错,或者是使用 yyyy-MM-dd HH:mm:ss
,如果传yyyy-MM-dd
也会报错,有很多的注意点
@GetMapping("/get")
public String getUserName(@DateTimeFormat(pattern = "yyyy-MM-dd") Date date) {
System.out.println("Get 日期类型参数接收 => " + date);
return "ok";
}
(9)日期类型参数接收(二)
1.请求url
注意与第一个请求url的区别
http://127.0.0.1:8080/api/get?date=2022/12/17 12:00:00
2. Postman
3.后端接收代码
可以不使用注解
@GetMapping("/get")
public String getUserName(Date date) {
System.out.println("Get 日期类型参数接收 => " + date);
return "ok";
}
(10)路径参数接收
1.请求url
2.前端请求代码
<script>
const request = axios.create({
baseURL: 'http://127.0.0.1:8080/api',
timeout: 1000,
});
request.get('/get'+ '/aDong/20')
</script>
3.后端接收代码
@GetMapping("/get/{name}/{age}")
public String getUserName(@PathVariable("name") String userName ,@PathVariable int age) {
System.out.println("Get 路径参数接收 => " + userName + ":" + age);
return "ok";
}