当前位置: 首页 > news >正文

@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博客中曾经提到&#xff0c;在Spring Boot中&#xff0c;通过URL传参、payload中的key-value形式或json形式&#xff0c;将前端数据以字符串格式发送到后端&#xff0c;后端We…...

在Python中优雅地打开和操作RDS

在Python中优雅地打开和操作RDS 随着数据存储需求的不断增长&#xff0c;关系数据库服务&#xff08;Relational Database Service, RDS&#xff09;成为了许多企业首选的数据存储方式。那么&#xff0c;在Python中如何轻松地与RDS进行交互呢&#xff1f;以下是一份详尽的指南…...

.whl文件下载及pip安装

以安装torch_sparse库为例 一、找到自己需要的版本&#xff0c;点击下载。 去GitHub的pyg-team主页中找到pytorch-geometric包。网址如下&#xff1a; pyg-team/pytorch_geometric​github.com/pyg-team/pytorch_geometric 然后点击如图中Additional Libraries位置的here&am…...

望繁信科技受邀出席ACS2023,为汽车行业数智化护航添翼

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

基于 C语言的 Modbus RTU CRC 校验程序

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

基于微信小程序的剧本杀游玩一体化平台

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 基于微信小程序JavaSpringBootVueMySQL的剧…...

AMD或Intel上编译出来的程序,可以跑在海光上吗?

在上一篇博文《海光处理器与AMD Zen1的指令差异-CSDN博客》中发现&#xff0c;海光相比AMD&#xff0c;缺失了一些指令集。 那么在AMD或Intel上编译出来的程序&#xff0c;可以跑在海光上吗&#xff1f; 这个问题的关键&#xff0c;在于编译器默认使用哪些指令来编译程序。以Ce…...

ChatGPT 4o 使用指南 (9月更新)

首先基础知识还是要介绍得~ 一、模型知识&#xff1a; GPT-4o&#xff1a;最新的版本模型&#xff0c;支持视觉等多模态&#xff0c;OpenAI 文档中已经更新了 GPT-4o 的介绍&#xff1a;128k 上下文&#xff0c;训练截止 2023 年 10 月&#xff08;作为对比&#xff0c;GPT-4…...

微信getUserProfile不弹出授权框

当我们在微信小程序开发工具中想要使用getUserProfile来获取个人信息的时候&#xff0c;会发现不弹出授权框&#xff0c;这是什么原因呢&#xff1f; 早在2022年的小程序官方公告中就已经明确给出了小程序用户头像昵称获取规则调整公告 因此如果还想继续使用getUserProfile的弹…...

iostat 命令:系统状态监控

一、命令简介 ​iostat ​命令用于报告系统中 CPU、磁盘、tty 设备和 CPU 利用率统计信息。 ‍ 需安装 sysstat ​软件包&#xff0c;该软件包提供了一组工具&#xff0c;包括 iostat​、sar​、mpstat ​等&#xff0c;用于系统性能监控和报告。 ‍ 二、命令参数 iostat…...

从底层原理上解释 ClickHouse 的索引

ClickHouse 是一款高性能的列式数据库&#xff0c;它通过列式存储、稀疏索引、MergeTree 引擎等技术实现了极高的查询效率和吞吐量。索引是数据库中提高查询效率的关键机制之一。为了深入了解 ClickHouse 中的索引实现机制&#xff0c;我们将从底层原理、关键数据结构以及 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相比&#xff0c;OSPFv3在工作机制上与OSPFv2基本相同&#xff1b;但为了支持IPv6地址格式&#xff0c;OSPFv3对OSPFv2做了一些改动。OSPFv3基于OSPFv2基本原理增强&#xff0c;是一个独立的路由协议&#xff08;v3不兼容v2&#xff09;协议号仍然是89…...

煤矿智慧矿井数据集 (1.煤矿采掘工作面智能分析数据集2.煤矿井下钻场智能分析数据集 )

智慧矿井智能分析数据集 数据1&#xff1a;数据1包含煤矿采掘工作面工人安全帽检测&#xff0c;工人行为检测&#xff08;行走&#xff0c;站立&#xff0c;坐&#xff0c;操作&#xff0c;弯腰&#xff0c;靠&#xff0c;摔&#xff0c;爬&#xff09;&#xff0c;液压支撑防护…...

举例说明协方差的数学公式计算步骤以及皮尔逊相关系数数学公式的计算步骤

例子&#xff1a;协方差的计算步骤 协方差是用于衡量两个随机变量之间的线性相关性的统计量。它表示两个变量如何一起变化。如果协方差为正&#xff0c;表示两个变量倾向于同方向变化&#xff1b;如果为负&#xff0c;表示它们倾向于反方向变化。 下面我们将通过一个具体的例…...

2024/9/16论文赏析(均为1区或顶刊

Labeled-to-Unlabeled Distribution Alignment for Partially-Supervised Multi-Organ Medical Image Segmentation 代码链接&#xff1a;GitHub - xjiangmed/LTUDA 论文链接&#xff1a;Labeled-to-Unlabeled Distribution Alignment for Partially-Supervised Multi-Organ …...

IDEA 2024.3 EAP新特征早览!

0 前言 IntelliJ IDEA 2024.3 第一个 EAP 版本已发布&#xff0c;提前体验 下一个重大版本的一部分改进。 持续关注 EAP 更新&#xff0c;未来几周内将推出更多 IntelliJ IDEA 新功能。尝试这些新功能&#xff0c;分享您的反馈&#xff0c;共同完善 IDE。 1 AI 助手 1.1 内…...

如何在安卓設備上更換IP地址?

IP地址是設備在網路中的唯一標識&#xff0c;通過IP地址&#xff0c;網路能夠識別並與設備進行通信。本文將詳細介紹在安卓設備上更換IP地址的幾種方法。 在安卓設備上更換IP地址的方法 1. 使用Wi-Fi網路更換IP地址 最簡單的方法是通過Wi-Fi網路更換IP地址。步驟如下&#x…...

LINUX网络编程:TCP(1)

目录 1.认识Tcp的报头 2.确认应答机制&#xff08;ACK&#xff09; 序号与确认序号 捎带应答 3.超时重传机制 4.Tcp连接管理 三次握手 为什是三次握手 四次挥手 理解TIMEWAIT 1.认识Tcp的报头 源端口和目的端口号没什么说的 32位的序号和确认序号&#xff0c;之后会介…...

基于PHP的新闻管理系统

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

普通程序员有必要深入学习JVM底层原理吗?

对于JVM&#xff0c;我想大部分小伙伴都是要面试了才会去学&#xff0c;其余时间基本不会去看。但值得一说的是&#xff0c;当你工作多年之后&#xff0c;你遇到的项目会越来越复杂&#xff0c;遇到的问题也会越来越复杂&#xff1a;各种古怪的内存溢出&#xff0c;死锁&#x…...

城通网盘直连解析终极指南:3步实现高速免费下载

城通网盘直连解析终极指南&#xff1a;3步实现高速免费下载 【免费下载链接】ctfileGet 获取城通网盘一次性直连地址 项目地址: https://gitcode.com/gh_mirrors/ct/ctfileGet ctfileGet是一个专业的城通网盘直连地址解析工具&#xff0c;能够帮助用户绕过复杂的下载流程…...

Phi-4-mini-reasoning vLLM参数详解:context_length=131072配置与性能调优

Phi-4-mini-reasoning vLLM参数详解&#xff1a;context_length131072配置与性能调优 1. 模型概述 Phi-4-mini-reasoning 是一个基于合成数据构建的轻量级开源模型&#xff0c;专注于高质量、密集推理的数据处理能力。作为Phi-4模型家族的一员&#xff0c;它特别针对数学推理…...

VASP表面建模进阶:利用现代脚本工具实现Slab模型原子选择性固定(POSCAR高效处理)

1. 为什么需要自动化处理POSCAR文件 在计算材料学领域&#xff0c;VASP作为第一性原理计算的黄金标准工具&#xff0c;其输入文件POSCAR的准确性直接决定了计算结果的可靠性。传统手动处理方式存在几个致命缺陷&#xff1a;首先&#xff0c;用Excel手工标记原子固定状态极易出错…...

router.push(‘/‘)跳转不触发重定向

我来帮你分析为什么 router.push(/) 没有按照预期跳转到 /fenlei 路径。 首先让我查看相关的代码文件&#xff1a; router/index.js{path: /,component: Layout,redirect: /fenlei},已查看文件 index.vue 225-240 已查看文件 index.js 65-85 现在让我查看更多上下文&#xff0c…...

Wan2.2-I2V-A14B部署教程:适配CUDA 12.4与驱动550.90.07的关键步骤

Wan2.2-I2V-A14B部署教程&#xff1a;适配CUDA 12.4与驱动550.90.07的关键步骤 1. 镜像概述与核心特性 Wan2.2-I2V-A14B是一款专为文生视频任务优化的私有部署镜像&#xff0c;针对RTX 4090D 24GB显存显卡和CUDA 12.4环境进行了深度适配。这个镜像最大的特点是开箱即用&#…...

实战演练:基于快马平台codex构建可一键部署的智能api接口生成器

今天想和大家分享一个特别实用的开发技巧——如何用AI快速生成可用的API接口代码。这个项目我是在InsCode(快马)平台上完成的&#xff0c;整个过程非常顺畅&#xff0c;尤其是最后的一键部署功能&#xff0c;让我省去了很多配置环境的麻烦。 项目背景与需求 最近在做一个内部…...

告别单调闪烁!用GD32F303的TIMER高级功能玩转PWM:实现S形曲线呼吸灯与多灯同步效果

解锁GD32F303定时器高阶玩法&#xff1a;S形曲线PWM与多灯协同控制艺术 呼吸灯效果在嵌入式设备中早已司空见惯&#xff0c;但大多数实现仍停留在简单的线性渐变阶段。当LED亮度以恒定速率变化时&#xff0c;人眼会感知到明显的"机械感"——就像早期数字音乐缺少模拟…...

别再搞混了!Docker部署Redis Stack时,选redis/redis-stack还是redis/redis-stack-server?

Redis Stack镜像选择指南&#xff1a;开发与生产环境的最佳实践 在容器化技术普及的今天&#xff0c;Docker已成为部署Redis Stack的首选方案。但面对官方提供的两个相似镜像——redis/redis-stack和redis/redis-stack-server&#xff0c;许多开发者常陷入选择困境。本文将深入…...

AI赋能运维:基于快马平台打造智能域名故障诊断与修复建议助手

最近在维护公司网站时遇到了新老域名切换导致的访问故障&#xff0c;传统排查流程需要手动分析日志、逐个测试可能原因&#xff0c;效率很低。这次尝试用InsCode(快马)平台的AI能力搭建了一个智能诊断工具&#xff0c;效果超出预期。分享下具体实现思路和关键环节&#xff1a; …...