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

news2025/1/11 14:53:56

Http请求参数接收

  • 1、简单参数
  • 2、实体参数
  • 3、数组参数
  • 4、集合参数
  • 5、日期参数
  • 6、Json格式参数(常用)
  • 7、路径参数(常用)
  • 8、接收请求参数常用的几个注解

Http请求能携带各种格式的请求参数。因此也就需要不同的接收方式。

1、简单参数

  • 请求参数名与方法形参变量名相同时,SpringBoot会自动进行类型转换。
  • 请求参数名与方法形参变量名不同时,可以使用@RequestParam注解进行映射。可以通过@RequestParam注解中的value属性或者name属性指定请求参数名,将其映射到方法形参变量。@RequestParam注解中required属性默认为true,意思是前端必须传递这个参数,前端不传则前端会返回4xx状态码。修改required为false,此参数为非必须。在用集合接收请求参数时也需要使用@RequestParam注解。

先测试请求参数名与方法形参变量名相同的情况。
发送请求:请求方式为GET,请求参数为name=Tom和age=10,GET请求方式的请求参数放在请求路径后。

// 前端发送GET请求
http://localhost:8080/simpleParam?name=Tom&age=10

在这里插入图片描述
定义接口接收请求:

// 简单参数
@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请求方式的请求参数放在请求体。

// 前端发送POST请求,可以看到,路径后没有请求参数,请求参数放在请求体中
http://localhost:8080/simpleParam

在这里插入图片描述
定义接口接收请求,使用@PostMapping注解设置请求路径:

// 简单参数
@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请求方式的请求参数放在请求路径后。

// 前端发送GET请求
http://localhost:8080/simpleParam?name=Tom&age=10

这次在接口方法中修改形参变量名。前端传递的变量名为 name,接口方法的变量名为username。使用@RequestParam将name映射到username。

// 简单参数
@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。

// 前端发送GET请求
http://localhost:8080/simplePojo?name=Tom&age=10

接收请求接口为:

// 简单实体对象
@GetMapping("/simplePojo")
public String simplePojo(User user){
    System.out.println(user.getName() + ":" + user.getAge());
    return "ok";
}

接口方法形式参数使用了一个类User,该类定义为:

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成员变量, 如下:

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,该类定义为:

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请求方式:

// 使用POST请求方式,请求参数放在请求体中
http://localhost:8080/complexPojo

在这里插入图片描述
Address也是一个实体类,在给Address传参时,使用的是变量名.变量名的格式。
接收请求接口为:

// 复杂实体对象
@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。

// 使用GET方式发送请求
http://localhost:8080/arrayParam/?hobby=game&hobby=basketball&hobby=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。

// POST方式发送请求,请求参数在请求体中
http://localhost:8080/listParam

在这里插入图片描述
接收请求接口为:

// 集合参数接收,需要使用@RequestParam注解
@PostMapping("/listParam")
public String listParam(@RequestParam List<String> hobby){
    System.out.println(hobby.toString());
    return "ok";
}

5、日期参数

前端传递日期参数时,服务端同样需要使用日期类型的参数进行接收。一般常用LocalDataTime的对象进行接收。
由于日期格式多样,所以需要在参数前使用@DateTimeFormat注解,通过pattern属性指定日期格式

@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") // 年-月-日 时:分:秒

发送请求:以GET方式发送请求,请求参数为updateTime=2024-12-04 14:36:00。

// GET方式发送请求
http://localhost:8080/dateParam?updateTime=2024-12-04 14:36:00

在这里插入图片描述
接收请求接口为

// 日期参数,使用@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方式发送请求。请求参数置于请求体中。

// POST方式发送请求,Json格式数据只能通过POST方式发出
http://localhost:8080/jsonParam

在这里插入图片描述
Json数据有两层,第一层有name、age、address三个量,第二层封装在address中,有province、city两个量,因此Java服务端接收的实体对象在结构与变量名上需要于此保持一致。

接收请求接口:

// JSON参数
@PostMapping("/jsonParam")
public String jsonParam(@RequestBody User user){
    System.out.println(user);
    return "ok";
}

接口参数中的User类在第一节已经使用过,这里不多赘述。

7、路径参数(常用)

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

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

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

发送请求:以GET方式发送请求,路径参数为一个数字,表示某张表的id字段。

// GET方式发送请求,路径参数为1
http://localhost:8080/pathParam/1

在这里插入图片描述
接收请求接口:

// 路径参数
@GetMapping("/pathParam/{id}")
public String pathParam(@PathVariable Integer id){
	System.out.println(id);
    return "ok";
}

8、接收请求参数常用的几个注解

@RequestMapping注解:一般使用其衍生注解

注解解释
@RequestMapping用于定义接口方法的请求路径(一般使用其衍生注解替换)
@GetMappingGet请求方式。一般用于向特定的资源发出请求,查询资源。
@PostMappingPost请求方式。 一般用于向指定资源提交数据进行处理请求
@PutMappingPut请求方式。一般用于向指定资源位置上传其最新内容
@DeleteMappingDelete请求方式。一般用于请求服务器删除请求路径所标识的资源

@RequestParam注解
有两种使用场景:

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

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

@PathVariable注解
在接收路径参数时使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2254816.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在 MacOS 上为 LM Studio 更换镜像源

在 MacOS 之中使用 LM Studio 部署本地 LLM时&#xff0c;用户可能会遇到无法下载模型的问题。 一般的解决方法是在 huggingface.co 或者国内的镜像站 hf-mirror.com 的项目介绍卡页面下载模型后拖入 LM Studio 的模型文件夹。这样无法利用 LM Studio 本身的搜索功能。 本文将…

Vue工程化开发中各文件的作用

1.main.js文件 main.js文件的主要作用&#xff1a;导入App.vue&#xff0c;基于App.vue创建结构渲染index.html。

Grule前端表单post后端执行grule引擎规则

Grule前端表单post后端执行grule引擎规则 编写前端表单和后端接口 编写test.go执行grule引擎规则 示例都是 go test 执行的测试代码&#xff0c;所以将里面的测试代码去除 由于之前 NumberExponentExample_test.go 已经验证可运行, 所以将 err 的异常处理去除 package mai…

Android hid 数据传输(device 端 )

最近一直在处理hid 数据需求&#xff0c;简而言之就是两台设备直接可以通过usb 线互相传递数据。 项目架构 为什么Device 端要采用HID&#xff08;人机接口设备&#xff09;的方式发送和接收数据呢&#xff1f; 主要是速度快&#xff0c;举个例子&#xff0c;就是鼠标移动&am…

【Unity基础】Unity中Transform.forward的详解与应用

在Unity中&#xff0c;Transform.forward 是一个常用属性&#xff0c;它表示物体的“前方”方向&#xff0c;即物体本地坐标系中 Z 轴&#xff08;蓝色轴&#xff09;在世界坐标系中的方向。它动态反映物体的旋转情况&#xff0c;非常适合用于移动、检测、方向控制等场景。 什么…

基于 RWKV 的视觉语言模型 VisualRWKV 被 COLING 2025 接收!

基于 RWKV 的视觉语言模型 VisualRWKV 被 COLING 2025 接收&#xff01; COLING&#xff0c;国际计算语言学会议&#xff08;International Conference on Computational Linguistics&#xff09;&#xff0c;是自然语言处理和计算语言学领域的顶级国际会议&#xff08;CCF 推…

如何加强游戏安全,防止定制外挂影响游戏公平性

在现如今的游戏环境中&#xff0c;外挂始终是一个困扰玩家和开发者的问题。尤其是定制挂&#xff08;Customized Cheats&#xff09;&#xff0c;它不仅复杂且隐蔽&#xff0c;更能针对性地绕过传统的反作弊系统&#xff0c;对游戏安全带来极大威胁。定制挂通常是根据玩家的需求…

斯坦福李飞飞《AI Agent:多模态交互前沿调查》论文

多模态AI系统很可能会在我们的日常生活中无处不在。将这些系统具身化为物理和虚拟环境中的代理是一种有前途的方式&#xff0c;以使其更加互动化。目前&#xff0c;这些系统利用现有的基础模型作为构建具身代理的基本构件。将代理嵌入这样的环境中&#xff0c;有助于模型处理和…

Lua面向对象实现

Lua中的面向对象是通过表&#xff08;table&#xff09;来模拟类实现的&#xff0c;通过setmetatable(table,metatable)方法&#xff0c;将一个表设置为当前表的元表&#xff0c;之后在调用当前表没有的方法或者键时&#xff0c;会再查询元表中的方法和键&#xff0c;以此来实现…

flex布局容易忽略的角色作用

目录 清除浮动 作用于行内元素 flex-basis宽度 案例一&#xff1a; 案例二&#xff1a; 案例三&#xff1a; flex-grow设置权重 案例一&#xff1a; 案例二&#xff1a; 简写flex-grow:1 0 auto; flex作为一维布局,行和列的使用&#xff0c;忽略的小角色&#xff0c;大…

Arduino IDE for mac 无法加载界面

打开软件后&#xff0c;无法加载界面的问题 1.手动删除“~/Library/Arduino15”文件夹 2.终端中输入sudo nano /etc/hosts&#xff0c;在里面添加“127.0.0.1 localhost”

【短视频SEO矩阵源码开发技术解析——框架应用分享】

为了部署短视频SEO矩阵系统&#xff0c;需要遵循以下核心步骤&#xff1a;首先&#xff0c;需掌握一系列关键技术和知识&#xff0c;涵盖但不限于相关领域的专业技能。 为了确保短视频SEO矩阵系统源代码能够顺利部署&#xff0c;首先需要构建一个适宜的服务器环境。您可以选择…

探索前端世界的无限可能:玩转Excel文件

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

本地运行打包好的dist

首先输入打包命令 每个人设置不一样 一般人 是npm run build如果不知道可以去package.json里去看。 打包好文件如下 命令行输入 :npm i -g http-server 进入到dist目录下输入 命令cmd 输入 http-server 成功

鸿蒙 DevEco Studio 设置状态栏,调用setWindowSystemBarProperties不生效

参考文章&#xff1a;设置状态栏&#xff0c;调用setWindowSystemBarProperties不生效 我使用 setWindowSystemBarProperties 设置状态栏&#xff0c;不生效。 import window from ohos.window;export default {data: {title: World},setSystemBar() {var windowClass null;…

MacOS安装软件后无法启动报错:“已损坏,无法打开,你应该将它移到废纸篓“

目录 报错截图 解决方法 知识科普 报错截图 解决方法 1. 打开系统设置->安全性与隐私->选择任何来源 2. 如果打开没有看到"任何来源"&#xff0c;如果不开启“任何来源”的选项&#xff0c;会直接影响到无法运行的第三方应用。开启“任何来源”的方法如下&a…

Linux-用户和权限

文章目录 一. 用户1. 用户分类① root用户(超级管理员)② 普通用户Ⅰ. 创建普通用户命令 ③ root用户与普通用户Ⅰ. 权限区别Ⅱ. 切换用户命令Ⅲ. sudo命令Ⅳ. 为普通用户配置sudo认证 2. 用户组① 用户,用户组② 创建用户组命令② 删除用户组命令② 用户管理命令③ getent 二.…

Flutter动画(二)内建隐式动画Widget

动画效果介绍中给出了选择动画的决策树&#xff1a; 使用动画框架不在我们讨论的话题内。flutter支持的动画包括隐式动画和显式动画。 隐式动画和显式动画 隐式动画和显示动画是两种不同的动画实现方式&#xff0c;它们的主要区别在于控制权和动画的重复性。 隐式动画&#…

【笔记2-5】ESP32:freertos消息队列

主要参考b站宸芯IOT老师的视频&#xff0c;记录自己的笔记&#xff0c;老师讲的主要是linux环境&#xff0c;但配置过程实在太多问题&#xff0c;就直接用windows环境了&#xff0c;老师也有讲一些windows的操作&#xff0c;只要代码会写&#xff0c;操作都还好&#xff0c;开发…

211高校的VMware迁移之路:迁至深信服云平台,更高效、更稳定

某211高校为国家 “双一流” 建设高校、省一流大学&#xff0c;在教育领域占据举足轻重的地位。其教学单位构成丰富多元&#xff0c;学科体系广泛而全面。然而&#xff0c;学校面临着VMware虚拟化平台维保到期、服务器老化等严峻挑战&#xff0c;严重干扰了教学、科研及管理工作…