SpringBoot接收参数的几种形式
在SpringBoot中获取参数基本方式有5种,需要都掌握.
这里需要记住一个技术术语或概念
API接口: 你写好的那个URL地址,就被称为API接口
1. 接收常规参数
给/param/demo1这个URL接口发送id, name两个参数
以上是以GET请求类型进行发送,实际发送的请求如下:
在SpringBoot端,我们可以直接在处理请求的那个方法形参上,写上和请求参数同名的形参名称即可
获取到的id和name参数:
@RequestMapping("/param/demo1")
public void demo1(int id, String name){
System.out.println("获取到的参数是:");
System.out.println("id:" + id);
System.out.println("name:" + name);
}
如果发送的是POST类型的请求,需要注意:POST请求的参数是放在请求体中提交给服务器端的.
我们接收的时候,也可以使用普通方法直接接收:
// 接收POST方式提交过来的数据
@RequestMapping("/param/demo2")
public void demo2(String gender, String name){
System.out.println("获取到的数据是:");
System.out.println("name = " + name);
System.out.println("gender = " + gender);
}
注意点,接收参数的时候,不一定非要和提交过来的参数顺序一致,只需要名称对应上即可.
如果提交的参数名称和接收的名称不一致,可以使用@RequestParam注解进行参数映射
// 接收POST方式提交过来的数据
@RequestMapping("/param/demo2")
public void demo2(@RequestParam("xingbie") String gender, String name){
System.out.println("获取到的数据是:");
System.out.println("name = " + name);
System.out.println("gender = " + gender);
}
2. 使用POJO接收参数
如果需要同时接收一批数据,而不想通过普通方式一个个接收,就可以使用POJO对象的方式来获取提交过来的所有数据
只需要POJO对象的属性名和提交过来的参数一一对应上就可以了
比如如果想接收name, age, school, gender这些参数
写一个POJO,属性和提交过来的参数可以对应的上, 注意,一定要有getter/setter方法
@Data
public class People {
private String name;
private int age;
private String school;
private String gender;
}
//如果同时提交过来一批数据(比如说10来个数据,我们要在形参中写上一堆参数吗?)
//如果同时提交过来的参数过多,我们可以考虑使用POJO方式接收
// Plain Old Java Object
@RequestMapping("/param/demo3")
public void demo3(People people){
System.out.println("接收到的数据是:");
System.out.println(people);
}
如果前端提交过来的数据是一个嵌套的数据,如何接收?
此时就需要使用嵌套的POJO来接收:
@Data
public class Address {
private String sheng;
private String shi;
private String xian;
}
@Data
public class Teacher {
private String name;
private int age;
private Address address;
}
//接收嵌套的参数
@RequestMapping("/param/demo4")
public void demo4(Teacher teacher){
System.out.println("接收到的数据是:");
System.out.println(teacher);
// 要获取所在的市
String shi = teacher.getAddress().getShi();
System.out.println("所在市:" + shi);
}
3. 接收数组或列表类型的数据
使用数组接收数据
// 接收数组数据
@RequestMapping("/param/demo5")
public void demo5(String[] likes){
System.out.println("接收到的数据是:");
System.out.println(Arrays.toString(likes));
}
使用集合接收数据,此时需要使用@RequestParam注解
@RequestMapping("/param/demo7")
public void demo7(@RequestParam List<String> likes){
System.out.println("接收到的数据是:");
System.out.println(likes);
}
4. 接收JSON类型的数据
JSON是什么
JSON是一种轻量级的数据交换格式,易于人阅读和编写,可以在多种语言之间进行数据交换
JSON数据的常用结构
- JSON对象
{
"name": "刘旭超",
"age": 36,
"likes": ["打游戏", "看电影"]
}
- JSON数组
[100, 200, 300]
["aaa", "bbb", "ccc"]
- JSON对象数组
[
{
"name": "刘旭超",
"age": 36
},
{
"name": "刘二超",
"age": 36
},
{
"name": "刘小超",
"age": 36
}
]
SpringBoot端接收JSON类型的数据
注意: 要接收JSON类型的数据,在SpringBoot的方法参数中一定要使用@RequestBody注解才可以
- 接收JSON对象
SpringBoot端需要先定义一个POJO:
比如定义一个People类,People类的属性一一的和JSON的数据对应上:
@Data
public class People {
private String name;
private int age;
private String[] likes;
}
@RequestMapping("/param/demo8")
public void demo8(@RequestBody People people) {
System.out.println(people);
}
- 接收JSON数组
假如有以下JSON数组:
SpringBoot端使用@RequestBody注解,参数类型使用的数组或列表集合直接接收即可:
// 使用数组接收
@RequestMapping("/param/demo9")
public void demo8(@RequestBody Integer[] numbers) {
System.out.println(Arrays.toString(numbers));
}
// 使用列表集合接收
@RequestMapping("/param/demo9")
public void demo8(@RequestBody List<Integer> numbers) {
System.out.println(numbers);
}
- 接收对象数组
假如有以下JSON数组:
JSON对象,即使使用{}包裹的,我们需要使用JAVA对象来做对应, 使用[]包裹的,我们需要使用数组或列表集合来对应
定义一个对象来接收JSON{}里的数据
@Data
public class People {
private String name;
private int age;
}
@RequestMapping("/param/demo9")
public void demo8(@RequestBody List<People> peopleList) {
System.out.println(peopleList);
}
5. 接收日期类型的参数
日期格式的数据,提交给SpringBoot的时候,我们是直接可以使用普通方式接受没有任何问题.
但是如果如上所示,我们使用字符串接收:
@RequestMapping("/param/demo10")
public void demo10(String startDate,String endDate){
// 此时接收到参数以后,startDate和endDate就是一个单纯的字符串,假如我们想使用年、月、日的
//据的时候
// 我们得使用字符串的一些方法来分割或截取才能获取到对应的年、月、日数据
String[] dateArray =
startDate.split("/");
String year = dateArray[0];
int yearInt = Interger.parseInt(year);
// 以上操作是不方便的
}
为了方便操作,SpringBoot是可以直接把前端提交过来的日期格式的数据,对应到JAVA的日期类型上,需要使用@DateTimeFormat注解+ Date类型对象来接收:
@RequestMapping("/param/demo10")
public void demo10(@DateTimeFormat(pattern = "yyyy/MM/dd") Date startDate,
@DateTimeFormat(pattern = "yyyy-MM-dd") Date endDate){
System.out.println(startDate.getMonth());
System.out.println(endDate);
}
的数据,对应到JAVA的日期类型上,需要使用@DateTimeFormat注解+ Date类型对象来接收:
@RequestMapping("/param/demo10")
public void demo10(@DateTimeFormat(pattern = "yyyy/MM/dd") Date startDate,
@DateTimeFormat(pattern = "yyyy-MM-dd") Date endDate){
System.out.println(startDate.getMonth());
System.out.println(endDate);
}