Http请求参数接收
Http请求能携带各种格式的请求参数。因此也就需要不同的接收方式。
1、简单参数
- 请求参数名与方法形参变量名相同时,SpringBoot会自动进行类型转换。
- 请求参数名与方法形参变量名不同时,可以使用@RequestParam注解进行映射。可以通过@RequestParam注解中的value属性或者name属性指定请求参数名,将其映射到方法形参变量。@RequestParam注解中required属性默认为true,意思是前端必须传递这个参数,前端不传则前端会返回4xx状态码。修改required为false,此参数为非必须。在用集合接收请求参数时也需要使用@RequestParam注解。
先测试请求参数名与方法形参变量名相同的情况。
发送请求:请求方式为GET,请求参数为name=Tom和age=10,GET请求方式的请求参数放在请求路径后。
java
// 前端发送GET请求
http://localhost:8080/simpleParam?name=Tom&age=10
定义接口接收请求:
java
// 简单参数
@RequestMapping("/simpleParam")
public String simpleParam(String name, Integer age) {
System.out.println(username + ":" + age);
return "OK";
}
// 控制台输出:
// Tom:10
// 前端接收到响应:
// OK
在接收请求的接口上使用了@RequestMapping注解,这个注解定义了接口接收请求的路径。在Restful风格下,会替换成其衍生注解@GetMapping 、@PostMapping 、@DeleteMapping 、@PutMapping等。
发送请求:请求方式为POST,请求参数为name=Tom和age=20,POST请求方式的请求参数放在请求体。
java
// 前端发送POST请求,可以看到,路径后没有请求参数,请求参数放在请求体中
http://localhost:8080/simpleParam
定义接口接收请求,使用@PostMapping注解设置请求路径:
java
// 简单参数
@PostMapping("/simpleParam")
public String simpleParamPost(String name, Integer age) {
System.out.println(name + ":" + age);
return "ok!";
}
// 控制台输出:
// Tom:20
// 前端接收到响应:
// ok!
测试请求参数名与方法形参变量名不同的情况。
发送请求:请求方式为GET,请求参数为name=Tom和age=10,GET请求方式的请求参数放在请求路径后。
java
// 前端发送GET请求
http://localhost:8080/simpleParam?name=Tom&age=10
这次在接口方法中修改形参变量名。前端传递的变量名为 name,接口方法的变量名为username。使用@RequestParam将name映射到username。
java
// 简单参数
@GetMapping("/simpleParam")
public String simpleParamGet(@RequestParam(name = "name")String username, Integer age) {
System.out.println(username + ":" + age);
return "OK";
}
2、实体参数
实体参数分为简单实体参数和复杂实体参数。
简单实体参数指的是用一个类去接收请求参数,这个类中的成员变量没有嵌套其他类。
复杂实体参数指的是用类中嵌套了其他类的类去接收请求参数。
这两种情况在发送请求时略有不同。但都需要保证请求参数名与实体类的成员变量名相同。
简单实体参数举例:
发送请求:以GET方式发送请求。请求参数为name=Tom和age=10。
java
// 前端发送GET请求
http://localhost:8080/simplePojo?name=Tom&age=10
接收请求接口为:
java
// 简单实体对象
@GetMapping("/simplePojo")
public String simplePojo(User user){
System.out.println(user.getName() + ":" + user.getAge());
return "ok";
}
接口方法形式参数使用了一个类User,该类定义为:
java
public class User {
private String name;
private Integer age;
public User() {
}
public User(String name, Integer age, Address address) {
this.name = name;
this.age = 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;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
SpringBoot会自动进行类型转换,将name和age转换到User的成员变量name和age中。
复杂实体参数举例:
在发送简单实体参数时,只发送了User的姓名和年龄,现在还想增加User的地址。首先改造一下User类,增加Address成员变量, 如下:
java
public class User {
private String name;
private Integer age;
private Address address;
public User() {
}
public User(String name, Integer age, Address address) {
this.name = name;
this.age = age;
this.address = address;
}
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;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", address=" + address +
'}';
}
}
Address类中有两个成员变量,分别是省份province和城市city,该类定义为:
java
public class Address {
private String province;
private String city;
public Address() {
}
public Address(String province, String city) {
this.province = province;
this.city = city;
}
public String getProvince() {
return province;
}
public void setProvince(String province) {
this.province = province;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
@Override
public String toString() {
return "Address{" +
"province='" + province + '\'' +
", city='" + city + '\'' +
'}';
}
}
由于此时前端传递的参数有四个,分别为姓名、年龄、省份、城市,参数量较多,因此考虑使用POST请求方式:
java
// 使用POST请求方式,请求参数放在请求体中
http://localhost:8080/complexPojo
Address也是一个实体类,在给Address传参时,使用的是变量名.变量名 的格式。
接收请求接口为:
java
// 复杂实体对象
@PostMapping("/complexPojo")
public String complexPojo(User user) {
System.out.println(user);
return "yes";
}
// 控制台输出:
// User{name='Tom', age=21, address=Address{province='湖北', city='武汉'}}
// 前端响应结果:
// yes
3、数组参数
使用数组接收请求参数时,只需要在接口方法中传入一个数组,同时保证数组名与请求参数名相同。
发送请求:使用GET方式发送请求,请求参数为hobby=game,hobby=basketball,hobby=java。
java
// 使用GET方式发送请求
http://localhost:8080/arrayParam/?hobby=game&hobby=basketball&hobby=java
请求接收接口为:
java
// 数组参数
@GetMapping("/arrayParam")
public String arrayParam(String[] hobby) {
System.out.println(Arrays.toString(hobby));
return "ok";
}
4、集合参数
在使用集合接收请求参数时,需要保持变量名与请求参数名一致,并且使用@RequestParam注解将请求参数与集合绑定,因为默认情况是使用数组接收。
发送请求:使用POST方式发送请求,请求参数为hobby=game,hobby=basketball,hobby=java。
java
// POST方式发送请求,请求参数在请求体中
http://localhost:8080/listParam
接收请求接口为:
java
// 集合参数接收,需要使用@RequestParam注解
@PostMapping("/listParam")
public String listParam(@RequestParam List<String> hobby){
System.out.println(hobby.toString());
return "ok";
}
5、日期参数
前端传递日期参数时,服务端同样需要使用日期类型的参数进行接收。一般常用LocalDataTime的对象进行接收。
由于日期格式多样,所以需要在参数前使用@DateTimeFormat注解,通过pattern属性指定日期格式。
java
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") // 年-月-日 时:分:秒
发送请求:以GET方式发送请求,请求参数为updateTime=2024-12-04 14:36:00。
java
// GET方式发送请求
http://localhost:8080/dateParam?updateTime=2024-12-04 14:36:00
接收请求接口为
java
// 日期参数,使用@DateTimeFormat注解指定日期格式
@GetMapping("/dateParam")
public String dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime) {
System.out.println(updateTime);
return "ok";
}
6、Json格式参数(常用)
前端在使用Json格式数据传递参数时,必须使用POST请求方式发送请求,Json数据放在请求体中。
在Java服务端通常使用实体对象接收Json格式数据。实体类中的成员变量名应和Json中的key保持一致,层次结构也应该保持一致。同时需要在方法形参前加上@RequestBody注解,将Json数据封装到实体对象中。
发送请求:使用POST方式发送请求。请求参数置于请求体中。
java
// POST方式发送请求,Json格式数据只能通过POST方式发出
http://localhost:8080/jsonParam
Json数据有两层,第一层有name、age、address三个量,第二层封装在address中,有province、city两个量,因此Java服务端接收的实体对象在结构与变量名上需要于此保持一致。
接收请求接口:
java
// JSON参数
@PostMapping("/jsonParam")
public String jsonParam(@RequestBody User user){
System.out.println(user);
return "ok";
}
接口参数中的User类在第一节已经使用过,这里不多赘述。
7、路径参数(常用)
路径参数是指传递的参数已经成为路径的一部分。也就是说,既是路径的一部分,也作为参数传递需要被服务端获取并使用。
接收路径参数要三步操作:
- 需要在定义路径的注解上将路径参数部分使用 {路径参数名} 替换。 { } 是路径参数占位符;
- 接口方法中接受路径参数的形参名与路径参数名保持一致;
- 接收路径参数的形参前需要加上@PathVariable注解。
发送请求:以GET方式发送请求,路径参数为一个数字,表示某张表的id字段。
java
// GET方式发送请求,路径参数为1
http://localhost:8080/pathParam/1
接收请求接口:
java
// 路径参数
@GetMapping("/pathParam/{id}")
public String pathParam(@PathVariable Integer id){
System.out.println(id);
return "ok";
}
8、接收请求参数常用的几个注解
@RequestMapping注解:一般使用其衍生注解
注解 | 解释 |
---|---|
@RequestMapping | 用于定义接口方法的请求路径(一般使用其衍生注解替换) |
@GetMapping | Get请求方式。一般用于向特定的资源发出请求,查询资源。 |
@PostMapping | Post请求方式。 一般用于向指定资源提交数据进行处理请求 |
@PutMapping | Put请求方式。一般用于向指定资源位置上传其最新内容 |
@DeleteMapping | Delete请求方式。一般用于请求服务器删除请求路径所标识的资源 |
... | ... |
@RequestParam注解 :
有两种使用场景:
- 前端请求携带简单参数时,请求参数名与接口方法变量名不一致,使用@RequestParam注解进行映射。
- 使用集合接收请求参数时,需要在集合变量前加@RequestParam注解,才能将数据自动封装到集合中。
@RequestBody注解 :
Json格式数据作为请求数据时,在Java服务端需要使用实体类来接收,并且需要在形参前加上@RequestBody注解。
@PathVariable注解 :
在接收路径参数时使用。