【JavaWeb后端学习笔记】SpringBoot框架下Http请求参数接收

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、路径参数(常用)

路径参数是指传递的参数已经成为路径的一部分。也就是说,既是路径的一部分,也作为参数传递需要被服务端获取并使用。

接收路径参数要三步操作:

  1. 需要在定义路径的注解上将路径参数部分使用 {路径参数名} 替换。 { } 是路径参数占位符;
  2. 接口方法中接受路径参数的形参名与路径参数名保持一致;
  3. 接收路径参数的形参前需要加上@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注解

有两种使用场景:

  1. 前端请求携带简单参数时,请求参数名与接口方法变量名不一致,使用@RequestParam注解进行映射。
  2. 使用集合接收请求参数时,需要在集合变量前加@RequestParam注解,才能将数据自动封装到集合中。

@RequestBody注解

Json格式数据作为请求数据时,在Java服务端需要使用实体类来接收,并且需要在形参前加上@RequestBody注解。

@PathVariable注解

在接收路径参数时使用。

相关推荐
用户8307196840823 小时前
Spring Boot 集成 RabbitMQ :8 个最佳实践,杜绝消息丢失与队列阻塞
spring boot·后端·rabbitmq
Java水解4 小时前
Spring Boot 视图层与模板引擎
spring boot·后端
Java水解4 小时前
一文搞懂 Spring Boot 默认数据库连接池 HikariCP
spring boot·后端
洋洋技术笔记8 小时前
Spring Boot Web MVC配置详解
spring boot·后端
tingshuo291718 小时前
S001 【模板】从前缀函数到KMP应用 字符串匹配 字符串周期
笔记
初次攀爬者1 天前
Kafka 基础介绍
spring boot·kafka·消息队列
用户8307196840821 天前
spring ai alibaba + nacos +mcp 实现mcp服务负载均衡调用实战
spring boot·spring·mcp
Java水解1 天前
SpringBoot3全栈开发实战:从入门到精通的完整指南
spring boot·后端
初次攀爬者2 天前
RocketMQ在Spring Boot上的基础使用
java·spring boot·rocketmq
花花无缺2 天前
搞懂@Autowired 与@Resuorce
java·spring boot·后端