【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注解

在接收路径参数时使用。

相关推荐
今天你比昨天博学了吗13 分钟前
CFD POST导出动画
学习
γ..14 分钟前
基于MATLAB的图像增强
开发语言·深度学习·神经网络·学习·机器学习·matlab·音视频
小王爱吃月亮糖24 分钟前
C++进阶-1-单继承、多继承、虚继承
开发语言·c++·笔记·学习·visual studio
zxguan42 分钟前
Springboot 学习 之 logback-spring.xml 日志压缩 .tmp 临时文件问题
spring boot·学习·spring
纪伊路上盛名在43 分钟前
爬虫1:uniprot蛋白质序列数据+canvas图片
数据库·学习·知识图谱·学习方法
小王爱吃月亮糖1 小时前
补充--C++的项目结构和管理
数据结构·c++·笔记·学习
Q_19284999065 小时前
基于Spring Boot的找律师系统
java·spring boot·后端
PP东6 小时前
ES6学习Generator 函数(生成器)(八)
javascript·学习·es6
小屁不止是运维8 小时前
麒麟操作系统服务架构保姆级教程(二)ssh远程连接
linux·运维·服务器·学习·架构·ssh
毕设资源大全9 小时前
基于SpringBoot+html+vue实现的林业产品推荐系统【源码+文档+数据库文件+包部署成功+答疑解惑问到会为止】
java·数据库·vue.js·spring boot·后端·mysql·html