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

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注解
在接收路径参数时使用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qt6.8 QGraphicsView鼠标坐标点偏差

ui文件拖放QGraphicsView&#xff0c;src文件定义QGraphicsScene赋值给图形视图。 this->scene new QGraphicsScene();ui.graph->setScene(this->scene);对graphicview过滤事件&#xff0c;只能在其viewport之后安装&#xff0c;否则不响应。 ui.graph->viewport…

macmini安装ubuntu网卡驱动BCM4360

安装成功效果如下 成功连接wifi 成功分配到IP 执行命令如下 1. sudo apt update 2. sudo apt install broadcom-sta-dkms 3. 重启电脑

网络测速工具

1. SPEEDTEST https://www.speedtest.net/ 2. 测速网 测速网 - 专业测网速, 网速测试, 宽带提速, 游戏测速, 直播测速, 5G测速, 物联网监测,Wi-Fi 7,Wi-Fi 6,FTTR,全屋Wi-Fi - SpeedTest.cn 3. 字节比特换算 bps&#xff08;bits per second&#xff09; 字节和比特的换算…

docker安装victoriametrics

docker安装victoriametrics 1、单机版安装2、victoriametrics增删改查2.1 、插入数据2.1.1 组装数据插入victoriametrics(java代码插入)2.1.2 Prometheus数据插入victoriametrics2.1.3 官网push到victoriametrics写法 2.2 、查询2.2.1 、Instant query&#xff08;即时查询&…

用ZipOutputStream生成的zip压缩包无法用WinRAR软件进行解压

1、问题 用WinRAR软件无法解压用ZipOutputStream生成的zip压缩包&#xff0c;而用360压缩就可以解压 2、原因 流没有正常关闭 3、解决办法 可以使用try-with-resources来自动关闭ZipOutputStream 例&#xff1a; public void compressedFile(String businessId, HttpServle…

WEB_星河飞雪_Windows(全)

Windows基础 这一节就主要将一些Windows的一些基础命令。 文件系统及其简述管理机制 首先linux操作系统有一个核心的概念就是——在linux中一切都是文件&#xff0c;几乎很多重要的东西都挂在根目录下&#xff08;“/”&#xff09;,它采用的是fhs目录结构&#xff08; File…

人工智能中的深度学习:原理与实践

什么是深度学习&#xff1f; 深度学习&#xff08;Deep Learning&#xff09;是机器学习的一个分支&#xff0c;旨在通过模拟人脑的神经网络结构来解决复杂的任务。深度学习通过多层神经网络&#xff0c;自动从数据中学习特征&#xff0c;避免了传统机器学习中手动特征工程的繁…

vite5+vue3+Ts5 开源图片预览器上线

images-viewer-vue3&#xff1a;一款Vue3的轻量级图像查看器&#xff0c;它基于Flip动画技术&#xff0c;支持PC和h5移动网页预览照片&#xff0c;如果它是Vue3开发的产品。 npm开源地址:https://www.npmjs.com/package/images-viewer-vue3?activeTabreadme Flip 动画 < …

Java 初学者的第一个 SpringBoot 系统

Java 初学者的第一个 SpringBoot 系统 对编程初学者而言&#xff0c;都存在一个 “第一个系统” 的问题。有些学习者找不到自己的 “第一个系统”&#xff0c;他们即使再努力也没有办法了解完整的系统&#xff0c;即使他们把教科书里的所有程序都跑通了。但是&#xff0c;面对…

传输层TCP_三次握手四次挥手的过程

三次握手四次挥手 三次握手 三次握手

光伏气象仿真系统的重要性

聊气象仿真系统的重要性之前先给大家推荐绿虫的仿真系统&#xff0c;绿虫可以获取到精准的气象数据&#xff0c;对接了国内气象站数据库&#xff0c;可以智能的匹配距离最近的&#xff0c;获取到最新最准的数据&#xff0c;下面给大家讲讲重要性。 一、提升发电效率方面&#x…

高阶数据结构--并查集--Java

一、并查集原理 在一些应用问题中&#xff0c;需要将n个不同的元素划分成一些不相交的集合。开始时&#xff0c;每个元素自成一个单元素集 合&#xff0c;然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复用到查询某一个元素归属于那个集 合的运算。适合于描述这…

SpringMVC ——(1)

1.SpringMVC请求流程 1.1 SpringMVC请求处理流程分析 Spring MVC框架也是⼀个基于请求驱动的Web框架&#xff0c;并且使⽤了前端控制器模式&#xff08;是⽤来提供⼀个集中的请求处理机制&#xff0c;所有的请求都将由⼀个单⼀的处理程序处理来进⾏设计&#xff0c;再根据请求…

Kube-Prometheus-Stack安装时初始化导入自定义Grafana dashboards

获取Grafana dashboards的JSON文件 这里是获取已经编辑好的Grafana dashboards的JSON文件&#xff1b;以便内置到Kube-Prometheus-Stack的helm charts的安装zip文件中。 编辑自定义dashboards JSON文件 获取dashboards JSON文件模板 其实Kube-Prometheus-Stack内部本身已经内…

手机租赁系统开发全攻略 创新服务助力企业智能转型

内容概要 在当今数字化飞速发展的时代&#xff0c;“手机租赁系统开发”正逐渐成为企业智能转型的必然选择。这一过程并不简单&#xff0c;但关键流程的解析将帮助企业理清思路。首先&#xff0c;了解需求和目标是基础&#xff0c;之后制定详细计划和流程图&#xff0c;让整件…

中安证件OCR识别技术助力鸿蒙生态:智能化证件识别新体验

在数字化和智能化的浪潮中&#xff0c;伴随国产化战略的深入推进&#xff0c;国产操作系统和软件生态的建设逐渐走向成熟。鸿蒙操作系统&#xff08;HarmonyOS Next&#xff09;作为华为推出的重要操作系统&#xff0c;凭借其开放、灵活和高效的特点&#xff0c;正在加速在多个…

Python_Flask03

这篇文章主要介绍的是数据库的增删改查操作&#xff0c;无多余好说的。 from flask import Flask from flask_sqlalchemy import SQLAlchemy from sqlalchemy import text from flask_migrate import Migrateapp Flask(__name__)# 本地基础信息的主机名 HOSTNAME "127.0…

Flink问题总结

目录 1、Flink 的四大特征(基石) 2、Flink 中都有哪些 Source,哪些 Sink,哪些算子(方法) 3、什么是侧道输出流,有什么用途 4、Flink 中两个流如何合并为一个流 5、Flink 中两个流如何 join 6、Flink 中都有哪些 window,什么是滑动,滚动窗口 7、flink 中都有哪些…

Q、K、V怎样学习到不同的特性;注意力机制和自注意力区别

目录 Q、K、V怎样学习到不同的特性 注意力机制和自注意力区别 Q、K、V怎样学习到不同的特性 Q = XW_Q:Query向量表示“我想要找什么”,通过输入向量X与权重矩阵W_Q的乘积得到。K = XW_K:Key向量表示“我有什么”,通过输入向量X与权重矩阵W_K的乘积得到。V = XW_V:Value向…

MySQL 入门大全:常用函数

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…