@PathVariable,@RequestParam,@RequestBody注解,springboot与前端请求之间的数据类型转换
前端数据与springboot java数据类型转换
springboot&mybatis中数组和字符串数据类型的转换-CSDN博客中曾经提到,在Spring Boot中,通过URL传参、payload中的key-value形式或json形式,将前端数据以字符串格式发送到后端,后端Web层控制器类(com.example.controller)中,根据使用的注解(比如@RequestBody)确定传参方式,并调用对应的内置类型转换器,来将前端传来的参数转换成相应的对象来接收这些数据 。本篇整理一下前端与springboot之间参数传递的几种常用注解和使用方式。
先从JMeter的三种请求形式说起
如果你熟悉JMeter,可以从这里看起,从自己熟悉的领域逐渐过渡到不熟悉的。如果不了解Jmeter,直接跳过,看springboot注解即可。
在JMeter Http post请求中,Header中的content-type有三种格式,分别为
- 支持key-value数据格式的application/x-www-form-urlencoded
- 支持json数据格式的application/json
- 支持各种混合数据格式,以表单形式提交的multipart/form-data
那么,分别对应SpringBoot中的注解,分别为:
- @RequestParam,
- @RequestBody,
- @RequestPart;
另外,@PathVariable注解仅供Http get请求使用。
@PathVariable
基本用法
http get请求中,所有的参数都在URL中,以字符串形式传递,然而在Controller中,需要使用java类型去接收,这里使用@PathVariable注解。它用于将请求URL中的某个部分作为方法的参数进行传递。通常配合@RequestMapping注解一起使用,将URL中的变量值绑定到Java方法的参数上。
例如,假设我们有以下路径:/books/{id},其中{id}是要提取的参数值。
前端js:
export function getBookById(id) {return request({url: '/books/' + id, method: 'get'})
}
后端controller中我们可以使用@PathVariable注解将{id}绑定到Java方法的参数上,如下所示:
@GetMapping("/books/{id}")
public String getBookById(@PathVariable("id") int bookId) {// 根据书籍ID获取书籍信息的逻辑处理
// ...
return "book details";
}
在上面的代码中,@PathVariable("id")注解将URI路径中的{id}参数进行数据类型转换,并绑定到函数的id参数上。这样,当我们访问/books/123时,id参数将被设置为123。
传递多个参数
使用逗号分隔参数
在路径中使用逗号分隔多个参数,然后在方法的参数列表中使用@PathVariable注解分别获取这些参数。例如:
export function getUser(id1,id2) {return request({url: '/users/' + id1+","+id2 method: 'get'})
}
@GetMapping("/users/{id1},{id2}")
public User getUser(@PathVariable("id1") Long id1,
@PathVariable("id2") Long id2) {// 执行逻辑
}
使用占位符{}传递多个参数
可以在路径中使用占位符{}传递多个参数,然后在方法的参数列表中使用@PathVariable注解获取这些参数,并使用@PathVariable注解的value属性指定参数名。例如:
export function getUser(id1,id2) {return request({url: '/users/' + id1+"/"+id2,method: 'get'})
}
@GetMapping("/users/{id1}/{id2}")
public User getUser(@PathVariable("id1") Long id1,
@PathVariable("id2") Long id2) {// 执行逻辑
}
使用Map传递多个参数
可以使用Map来接收路径中的多个参数,其中Map的key为参数名,value为参数值。例如:
export function getUser(param) {return request({url: '/users/' + param, method: 'get'})
}
@GetMapping("/users/{param}")
public User getUser(@PathVariable Map<String, String> param) {Long id1 = Long.valueOf(param.get("id1"));Long id2 = Long.valueOf(param.get("id2"));// 执行逻辑
}
请求示例:GET /users/id1=1&id2=2
@RequestParam
基本用法
前面说过,@requestParam注解对应content-type中支持key-value数据格式的application/x-www-form-urlencoded,这种请求,参数有两种形式:
1、在URL中,但是使用?与前面的URI区分
2、在请求体中,但是是以key-value键值形式存在,而非json格式(区别于后面的@requestBody注解)
所以,前端axios中对应的参数为param。例如
export function getUser(param) {return request({url: '/users', method: 'get',params: param})
}
后端controller中:
@GetMapping("/users")
public User getUser(@requestParam Long param) { // 执行逻辑
}
需要传递多个参数时
1、列举
export function getUser(id1,id2) {return request({url: '/users', method: 'get',params: {id1,id2}})
}//controller中
@GetMapping("/users")
public User getUser(@requestParam Long id1,Long id2) { // 执行逻辑
}
2、使用自定义的实体类
//调用
let query = {
userName: myName,
userId: 1
};
this.getUser(query);//axios请求
export function getUser(query) {return request({url: '/users', method: 'get',params: query})
}//controller中
@GetMapping("/users")
public User getUser(@requestParam myUser query) {String userName = query.getUserName();Long userId = query.getUserId();// 执行逻辑
}
@RequestBody
但是对于需要传递更多参数的请求,大多使用json格式传递参数,此时,@requestParam就不能满足需求,需要使用@RequestBody了,此时,前端axios中需要使用data来传参,而不能用params了。
//调用
let user = {
userName: myName,
userId: 1
};
this.addUser(user);//axios请求
export function addUser(user) {return request({url: '/addUser', method: 'post',data: user})
}//controller中
@PostMapping("/addUser")
public User addUser(@requestBody myUser user) {String userName = user.getUserName();Long userId = user.getUserId();// 执行逻辑
}
总结
- get请求中,可以使用@pathVariable和@requestParam注解
- 当URL使用/url/{id}方式时,使用@pathVariable注解,从路径中获取参数。此时后端controller中是@GetMapping("/users/{id}")
- 当URL使用/url?id=123方式时,使用@requestParam注解,从查询字符串中获取参数。此时后端controller中是@GetMapping("/users")
- post请求中,可以使用@requestParam和@requestBody
- @requestParam对应前端axios的参数为params
- @requestBody对应前端axios的参数为data
使用时一定要注意前后端的对应
相关文章:
@PathVariable,@RequestParam,@RequestBody注解,springboot与前端请求之间的数据类型转换
前端数据与springboot java数据类型转换 springboot&mybatis中数组和字符串数据类型的转换-CSDN博客中曾经提到,在Spring Boot中,通过URL传参、payload中的key-value形式或json形式,将前端数据以字符串格式发送到后端,后端We…...
在Python中优雅地打开和操作RDS
在Python中优雅地打开和操作RDS 随着数据存储需求的不断增长,关系数据库服务(Relational Database Service, RDS)成为了许多企业首选的数据存储方式。那么,在Python中如何轻松地与RDS进行交互呢?以下是一份详尽的指南…...

.whl文件下载及pip安装
以安装torch_sparse库为例 一、找到自己需要的版本,点击下载。 去GitHub的pyg-team主页中找到pytorch-geometric包。网址如下: pyg-team/pytorch_geometricgithub.com/pyg-team/pytorch_geometric 然后点击如图中Additional Libraries位置的here&am…...

望繁信科技受邀出席ACS2023,为汽车行业数智化护航添翼
2023年5月25-26日,ACS2023第七届中国汽车数字科技峰会在上海成功举行。此次峰会汇聚了众多汽车领域的顶级专家、产业链代表及企业高管,共同探讨当今汽车产业的转型与未来发展趋势。 作为唯一受邀的流程挖掘厂商代表,望繁信科技携最新行业优势…...

基于 C语言的 Modbus RTU CRC 校验程序
一、CRC校验原理 Modbus RTU是一种常用于工业设备通信的协议,它基于串行通信,如RS-232或RS-485。在Modbus RTU中,CRC(循环冗余校验)是一种常用的错误检测机制,用于确保数据在传输过程中的完整性和准确性。 …...

基于微信小程序的剧本杀游玩一体化平台
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 基于微信小程序JavaSpringBootVueMySQL的剧…...
AMD或Intel上编译出来的程序,可以跑在海光上吗?
在上一篇博文《海光处理器与AMD Zen1的指令差异-CSDN博客》中发现,海光相比AMD,缺失了一些指令集。 那么在AMD或Intel上编译出来的程序,可以跑在海光上吗? 这个问题的关键,在于编译器默认使用哪些指令来编译程序。以Ce…...

ChatGPT 4o 使用指南 (9月更新)
首先基础知识还是要介绍得~ 一、模型知识: GPT-4o:最新的版本模型,支持视觉等多模态,OpenAI 文档中已经更新了 GPT-4o 的介绍:128k 上下文,训练截止 2023 年 10 月(作为对比,GPT-4…...

微信getUserProfile不弹出授权框
当我们在微信小程序开发工具中想要使用getUserProfile来获取个人信息的时候,会发现不弹出授权框,这是什么原因呢? 早在2022年的小程序官方公告中就已经明确给出了小程序用户头像昵称获取规则调整公告 因此如果还想继续使用getUserProfile的弹…...
iostat 命令:系统状态监控
一、命令简介 iostat 命令用于报告系统中 CPU、磁盘、tty 设备和 CPU 利用率统计信息。 需安装 sysstat 软件包,该软件包提供了一组工具,包括 iostat、sar、mpstat 等,用于系统性能监控和报告。 二、命令参数 iostat…...
从底层原理上解释 ClickHouse 的索引
ClickHouse 是一款高性能的列式数据库,它通过列式存储、稀疏索引、MergeTree 引擎等技术实现了极高的查询效率和吞吐量。索引是数据库中提高查询效率的关键机制之一。为了深入了解 ClickHouse 中的索引实现机制,我们将从底层原理、关键数据结构以及 Clic…...
9.20-使用k8s部署wordpress项目
部署wordpress项目 部署mariadb # 启动docker进程systemctl start docker# 拉取三个镜像docker pull nginx:alpinedocker pull wordpress:latestdocker pull mariadb:latest# 保存三个镜像cddocker save -o wordpress.tar wordpress:latestdocker save -o mariadb.tar…...

OSPFv3协议几类LSA介绍
OSPFv3协议介绍 与OSPFv2相比,OSPFv3在工作机制上与OSPFv2基本相同;但为了支持IPv6地址格式,OSPFv3对OSPFv2做了一些改动。OSPFv3基于OSPFv2基本原理增强,是一个独立的路由协议(v3不兼容v2)协议号仍然是89…...

煤矿智慧矿井数据集 (1.煤矿采掘工作面智能分析数据集2.煤矿井下钻场智能分析数据集 )
智慧矿井智能分析数据集 数据1:数据1包含煤矿采掘工作面工人安全帽检测,工人行为检测(行走,站立,坐,操作,弯腰,靠,摔,爬),液压支撑防护…...
举例说明协方差的数学公式计算步骤以及皮尔逊相关系数数学公式的计算步骤
例子:协方差的计算步骤 协方差是用于衡量两个随机变量之间的线性相关性的统计量。它表示两个变量如何一起变化。如果协方差为正,表示两个变量倾向于同方向变化;如果为负,表示它们倾向于反方向变化。 下面我们将通过一个具体的例…...
2024/9/16论文赏析(均为1区或顶刊
Labeled-to-Unlabeled Distribution Alignment for Partially-Supervised Multi-Organ Medical Image Segmentation 代码链接:GitHub - xjiangmed/LTUDA 论文链接:Labeled-to-Unlabeled Distribution Alignment for Partially-Supervised Multi-Organ …...

IDEA 2024.3 EAP新特征早览!
0 前言 IntelliJ IDEA 2024.3 第一个 EAP 版本已发布,提前体验 下一个重大版本的一部分改进。 持续关注 EAP 更新,未来几周内将推出更多 IntelliJ IDEA 新功能。尝试这些新功能,分享您的反馈,共同完善 IDE。 1 AI 助手 1.1 内…...
如何在安卓設備上更換IP地址?
IP地址是設備在網路中的唯一標識,通過IP地址,網路能夠識別並與設備進行通信。本文將詳細介紹在安卓設備上更換IP地址的幾種方法。 在安卓設備上更換IP地址的方法 1. 使用Wi-Fi網路更換IP地址 最簡單的方法是通過Wi-Fi網路更換IP地址。步驟如下&#x…...

LINUX网络编程:TCP(1)
目录 1.认识Tcp的报头 2.确认应答机制(ACK) 序号与确认序号 捎带应答 3.超时重传机制 4.Tcp连接管理 三次握手 为什是三次握手 四次挥手 理解TIMEWAIT 1.认识Tcp的报头 源端口和目的端口号没什么说的 32位的序号和确认序号,之后会介…...

基于PHP的新闻管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于phpMySQL的新闻管理系统。…...

6.C++程序中的基本数据类型
数据类型是指在C中用于声明不同类型变量或函数的一个系统或抽象或者是一个分类,它决定了变量存储占用的内存空间以及解析存储的位模式。其实数据类型可以理解为固定内存大小的别名,是创建变量的模具,具体使用哪种模具(包括自定义&…...
oracle 11g写一个判断是否是身份证的函数,函数名称为:FUN_IS_IDENNO
下面是一个用于判断是否是身份证号码的Oracle 11g函数(FUN_IS_IDENNO)。身份证号码通常为18位(或者旧的15位),前17位为数字,第18位为数字或字母X,并且需要符合一定的规则,例如出生日…...
如何使用Spring Cloud Gateway搭建网关系统
使用Spring Cloud Gateway搭建网关系统是一个涉及多个步骤的过程,主要包括创建Spring Boot项目、添加 Spring Cloud Gateway依赖、配置路由规则以及运行和测试网关。以下是详细的步骤:一、创建Spring Boot项目 选择工具: 可以使用Spring Ini…...

油烟机制造5G智能工厂物联数字孪生平台,推进制造业数字化转型
油烟机制造5G智能工厂物联数字孪生平台,是智能制造与信息技术的深度融合产物。数字孪生工业互联平台通过部署在工厂各个环节的传感器和设备,实时采集、分析和处理生产过程中的海量数据,构建出高度逼真的数字孪生模型。这一模型不仅能够真实反…...
《拿下奇怪的前端报错》序章:报错输出个数值数组Buffer(475) [Uint8Array],我来教它说人话!
作为前端开发者,你可能会遇到过一些奇奇怪怪的报错(相信我你早晚会遇到),关键是它未给出具体错误的位置,或者是一些很奇怪的信息。 我以前都是还原代码,然后找到错误的位置。或者是瞎弄一通,测试…...

Docker 里面按照ifconfig
1. 进入Docker 容器内部 docker exec -it xxx bash2. 安装 net-tools iputils-ping apt-get update && apt-get install -y net-tools apt-get update && apt-get install -y iputils-ping 3. 执行ifconfig 执行ping...

DOS(Disk Operating System,磁盘操作系统)常用指令
目录 背景: 早期探索: DOS之父: 发展历程: 常用指令: 进入命令: 操作1.进入和回退: 操作2.增、删: 操作3.其它: 总结: 背景: 早期探索: DOS(Disk Operating System,磁盘操作系统)在…...
VSCode集成Python环境搭建配置详细步骤
1. 安装VSCode 在开始我们的Python编程之旅前,首先需要准备好我们的开发工具——Visual Studio Code,简称VSCode。VSCode是一款由微软开发的轻量级但功能强大的源代码编辑器,支持多种编程语言,并且拥有丰富的扩展生态系统。接下来,我们将一步步教你如何下载、安装以及汉化…...

OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【扩展组件】上
往期知识点记录: 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~ 子系统开发内核 轻量系统内核(LiteOS-M) 轻量系统内核&#…...

Windows【环境 01】服务器系统重装后的服务恢复(ES\Redis\Jafka\Tomcat)环境变量和服务注册
服务器系统重装后的服务恢复 1.原因2.问题处理2.1 JDK2.2 Elasticsearch2.3 Redis2.4 Jafka2.5 Tomcat 3.总结 1.原因 Windows 服务器系统盘损坏,换了硬盘并重做了系统,其他磁盘未损坏但安装的服务无法正常运行了,包括: Elastic…...