Spring Boot中请求参数读取方式

目录

一、前言

二、六种参数读取方式

1.@RequestParam

2.@PathVariable

3.@RequestBody

4.@RequestHeader

5.@CookieValue

6.@MatrixVariable

三、对比和搭配

1.适用方法类型及建议使用场景

2.建议使用的请求路径注解

3. 多种参数同时使用

4.同一请求不同方案?

四、结语

一、前言

在 Spring Boot 开发中,接口设计与请求参数的读取方式是每个开发者必须掌握的核心知识点。本文基于一个真实的用户管理模块(UserController)展开讨论,深入剖析了常见的六种请求参数绑定注解(如 @RequestParam、@RequestBody 等)的使用场景、适用 HTTP 方法类型以及它们在实际开发中的最佳实践。
通过问答的形式,我们不仅梳理了不同注解的使用差异,还探讨了 RESTful 风格的设计理念、接口方法选择的原则,以及为何在某些场景下更推荐使用 @GetMapping 而非 @PostMapping。文章内容贴近实战,适合初学者快速入门,也适合有一定经验的开发者进行知识体系的查漏补缺。

二、六种参数读取方式

1.@RequestParam

1.定义:从 URL 查询参数中获取值

2.后端示例:

    //单个参数@GetMapping("/getUserById")public UserEntity getUserById(@RequestParam("id") Integer id) {return userService.getUserById(id);}//多个参数@GetMapping("/getUserById")public UserEntity getUserById(@RequestParam("id") Integer id, @RequestParam("name") String name) {return userService.getUserById(id);}

3.前端 Axios 调用:

//单个参数
axios.get('/getUserById', { params: { id: 123 } }).then(res => console.log(res.data));
//多个参数
axios.get('/getUserById', { params: { id: 123, name: '王' } }).then(res => console.log(res.data));

 4.Postman调用:

多个参数用&隔开,如下:

2.@PathVariable

1.定义:从路径中提取变量

2.后端示例:

//单个参数
@GetMapping("/user/{id}")
public String getUserById(@PathVariable Integer id) {return "User ID: " + id;
}
//多个参数
@GetMapping("/user/{id}/{name}")
public String getUserById(@PathVariable Integer id, @PathVariable String name) {return "User ID: " + id;
}

3.前端 Axios 调用:

//单个参数
axios.get('/user/456').then(res => console.log(res.data));
//多个参数
axios.get('/user/456/王').then(res => console.log(res.data));

4.Postman调用

多个参数用/路径隔开。

3.@RequestBody

1.定义:从请求体中读取 JSON 数据

2.后端示例:

 @PostMapping("/addUser")public Integer addUser(@RequestBody UserEntity userEntity) {return userService.addUser(userEntity);}

3.前端Axios调用:

axios.post('/user/addUser', {name: '张三',email: 'zhangsan@example.com'
})
.then(res => console.log(res.data));

 4.Postman调用:

4.@RequestHeader

1.定义:从 HTTP 请求头中获取值

2.后端示例:

@GetMapping("/auth")
public String checkAuth(@RequestHeader("Authorization") String token) {return "Token: " + token;
}

3.前端Axios调用:

axios.get('/auth', {headers: { Authorization: 'Bearer token' }
})
.then(res => console.log(res.data));

4.Postman调用:

5.@CookieValue

1.定义:从 Cookie 中获取值

2.后端示例:

@GetMapping("/profile")
public String getProfile(@CookieValue("JSESSIONID") String sessionId) {return "Session ID: " + sessionId;
}

3.前端Axios调用(浏览器自动携带 Cookie):

axios.get('/profile').then(res => console.log(res.data));

(注:前端无法直接设置 Cookie 来模拟发送,需由后端设置或在浏览器环境中已有该 Cookie。 )

6.@MatrixVariable

1.定义:从 URI 中提取矩阵参数(不常用)

2.后端示例:

//单个参数
@GetMapping("/users")
public String getUsersByMatrix(@MatrixVariable("type") String type) {return "Type: " + type;
}
//多个参数
@GetMapping("/users")
public String getUsersByMatrix(@MatrixVariable("type") String type,@MatrixVariable("name") String name
) {return "Type: " + type;
}

3.前端Axios调用:

多个参数用;隔开

//单个参数
axios.get('/users/2024;type=admin').then(res => console.log(res.data));
//多个参数
axios.get('/users/2024;type=admin;name=王').then(res => console.log(res.data));

4.Postman调用:

多个参数用;隔开

三、对比和搭配

1.适用方法类型及建议使用场景

2.建议使用的请求路径注解

3. 多种参数同时使用

1.Spring MVC 支持在一个接口中混合使用多个参数注解。只要请求中提供了这些参数,就可以全部绑定到方法参数上,如下:

@GetMapping("/user/{id}")
public String getUserInfo(@PathVariable("id") Integer id,@RequestParam("name") String name,@RequestHeader("Authorization") String token,@CookieValue("JSESSIONID") String sessionId,@MatrixVariable("type") String type) {return String.format("ID: %d, Name: %s, Token: %s, Session ID: %s, Type: %s",id, name, token, sessionId, type);
}

2. @RequestBody 不能与 @RequestParam、@PathVariable 等一起出现在同一个方法中(因为 @RequestBody 只能处理整个请求体)。
3.若使用了 @RequestBody,其他参数只能从 Header、Cookie、Path Variable 等非 Body 的地方获取。

4.同一请求不同方案?

看了上面的注解搭配,有同学就要问了,我可以把@GetMapping+@RequestParam组合改成@PostMapping + @RequestBody啊,因为我post请求用着比较熟练,就像下面这样:

@GetMapping("/getUserById")
public UserEntity getUserById(@RequestParam("id") Integer id)||V
public class UserIdDTO {private Integer id;// getter/setter
}@PostMapping("/getUserById")
public UserEntity getUserById(@RequestBody UserIdDTO dto) {return userService.getUserById(dto.getId());
}

答:这种方式是可以的,虽然在技术上可以都用@PostMapping+@RequestBody,在实际开发中我们遵循一些约定俗成的设计原则和 RESTful 风格,比如:

  • 语义清晰:GET 表示获取资源,POST 表示创建资源。符合 RESTful 设计规范。
  • 幂等性&安全性:GET 请求是幂等且安全的(不会改变服务器状态),更适合查询操作。
  • 缓存友好:GET 请求可以被缓存,而 POST 不会。
  • 书签/历史记录支持:GET 请求能保存在浏览器历史或书签中,方便调试或直接访问。
  • 简单易测试:使用 URL 参数更容易通过浏览器或 Postman 直接测试。

注:以下是RESTful风格最佳实践。

 

四、结语

通过对 UserController 示例代码的深入分析,我们可以看到 Spring MVC 在接口设计上的灵活性与规范性并存。理解每种参数绑定方式的适用场景和限制,有助于我们在日常开发中写出更加清晰、安全、可维护的接口。
同时,Spring 提供的 @RequestMapping 及其派生注解,为我们构建结构良好的 Web API 提供了强有力的支撑。合理地使用这些注解,不仅能提升开发效率,还能增强接口的可读性和一致性。
希望本文能帮助你在 Spring Boot 接口设计与参数处理方面有所收获。如果你在开发过程中也有类似疑问,欢迎留言交流,共同进步 

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

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

相关文章

2025华为OD机试真题最新题库 (B+C+D+E+2025A+2025B卷) + 在线OJ在线刷题使用(C++、Java、Python C语言 JS合集)(正在更新2025B卷,目前已收录710道)

2025年,已经开始使用AB卷题库,题目和往期一样,旧题加新题的组合,有题目第一时间更新,大家可以跟着继续学习,目前使用复用题较多,可在OJ上直接找到对应的AB卷学习,可以放心学习&#…

分析新旧因子相关性

计算一组新因子、并分析它们与已有因子间的相关性1. 导入库和初始化环境功能代码解析数据加载2. 定义新因子计算函数功能代码解析因子 1:波动率过滤器(filter_001_1)因子 2:ATR 过滤器(filter_001_2)因子 3…

Unity Demo——3D平台跳跃游戏笔记

今天是一个3D平台跳跃游戏的笔记。我们按照以下分类来对这个项目的代码进行学习:核心游戏系统 (Core Game Systems)核心游戏系统是IkunOdyssey项目的基础,负责所有游戏对象(如玩家、敌人、道具等)的通用行为和物理交互。它通过实体…

【C语言】回调函数、转移表、qsort 使用与基于qsort改造冒泡排序

文章目录数组指针/指针数组函数指针函数指针数组函数指针数组用途(转移表)回调函数qsort函数基于qsort改造冒泡排序源码数组指针/指针数组 int arr1[5] { 1,2,3,4,5 };int (*p1)[5] &arr1; //p1是数组指针变量int* arr2[5] { 0 }; //arr2是指针数组指针数组是存放指…

vue3 uniapp 使用ref更新值后子组件没有更新 ref reactive的区别?使用from from -item执行表单验证一直提示没有值

遇到这样一个问题,我有个1个页面A,一个from表单组件,一个form-item组件, 使用是这样的,我在父组件A中使用 ,执行表单验证一直提示没有值咱们先来讲一讲ref 和reactive的区别 ref 用来创建一个基本类型或单…

PyQt5布局管理(QBoxLayout(框布局))

QBoxLayout(框布局) 采用QBoxLayout类可以在水平和垂直方向上排列控件,QHBoxLayout和 QVBoxLayout类继承自QBoxLayout类。 QHBoxLayout(水平布局) 采用QHBoxLayout类,按照从左到右的顺序来添加控件。QHBoxL…

Grok 4作战图刷爆全网,80%华人横扫硅谷!清华上交校友领衔,95后站C位

来源 | 新智元短短两年,马斯克Grok 4的横空出世,让xAI团队一举站上AI之巅。昨日一小时发布会,Grok 4让所有人大开眼界,直接刷爆了AIME 2025、人类最后的考试(HLE)两大基准。这是狂堆20万GPU才换来的惊人成果…

AI大模型(七)Langchain核心模块与实战(二)

Langchain核心模块与实战(二)Langchian向量数据库检索Langchian构建向量数据库和检索器批量搜索返回与之相似度最高的第一个检索器和模型结合得到非笼统的答案LangChain构建代理通过代理去调用Langchain构建RAG的对话应用包含历史记录的对话生成Langchia…

Flutter基础(前端教程①-容器和控件位置)

一个红色背景的 Container垂直排列的 Column 布局中央的 ElevatedButton按钮下方的白色文本import package:flutter/material.dart;void main() {runApp(const MyApp()); }class MyApp extends StatelessWidget {const MyApp({Key? key}) : super(key: key);overrideWidget bu…

CSS flex

目录 flex-box和flex-item 主轴和副轴 ​编辑 flex-box的属性 flex-direction flex-wrap flex-flow justify-content ​编辑​align-items align-content flex-item的属性 flex-basis flex-grow flex-shrink flex flex-box和flex-item 当把一个块级元素的displ…

【JMeter】执行系统命令

步骤如下: 添加JSP233 Sampler:右击线程组>添加>取样器>JSR223 Sampler2.填写脚本,执行后查看日志。res "ipconfig".execute().text log.info(res)res "python -c \"print(11)\"".execute().text l…

AI Agent开发学习系列 - langchain之memory(1):内存中的短时记忆

内存中的短时记忆,在 LangChain 中通常指 ConversationBufferMemory 这类“对话缓冲记忆”工具。它的作用是:在内存中保存最近的对话历史,让大模型能理解上下文,实现连续对话。 对话缓冲记忆”工具 主要特点 只保留最近的对话内容…

uniapp实现微信小程序端图片保存到相册

效果图展示 安装插件海报画板导入到项目里面&#xff0c;在页面直接使用 <template><view><button click"saveToAlbum" class"save-button">保存到相册</button><image :src"path" mode"widthFix" v-if&qu…

Java生产带文字、带边框的二维码

Java 生成带文字、带边框的二维码1、Java 生成带文字的二维码1.1、导入jar包1.2、普通单一的二维码1.2.1、代码示例1.2.2、效果1.3、带文字的二维码1.&#xff13;.&#xff11;、代码示例1.3.2、效果2、带边框的二维码2.1、代码示例2.2、带边框的二维码效果 1、Java 生成带文字…

ARM单片机启动流程(三)(栈空间综合理解及相关实际应用)

文章目录1、引出栈空间问题2、解决问题2.1、RAM空间2.2、RAM空间具体分布2.3、关于栈空间的使用2.4、栈溢出2.5、变量的消亡2.6、回到关键字static2.7、合法性的判断1、引出栈空间问题 从static关键字引出该部分内容。 为什么能从static引出来&#xff1f; 在使用该关键字的…

【RK3568+PG2L50H开发板实验例程】FPGA部分 | 键控LED实验

本原创文章由深圳市小眼睛科技有限公司创作&#xff0c;版权归本公司所有&#xff0c;如需转载&#xff0c;需授权并注明出处&#xff08;www.meyesemi.com) 1.实验简介 实验目的&#xff1a; 从创建工程到编写代码&#xff0c;完成引脚约束&#xff0c;最后生成 bit 流下载到…

【Python练习】039. 编写一个函数,反转一个单链表

039. 编写一个函数,反转一个单链表 039. 编写一个函数,反转一个单链表方法 1:迭代实现运行结果代码解释方法 2:递归实现运行结果代码解释选择方法迭代法与递归法的区别039. 编写一个函数,反转一个单链表 在 Python 中,可以通过迭代或递归的方式反转一个单链表。 方法 1…

BERT代码简单笔记

参考视频&#xff1a;BERT代码(源码)从零解读【Pytorch-手把手教你从零实现一个BERT源码模型】_哔哩哔哩_bilibili 一、BertTokenizer BertTokenizer 是基于 WordPiece 算法的 BERT 分词器&#xff0c;继承自 PreTrainedTokenizer。 继承的PretrainedTokenizer&#xff0c;具…

PID控制算法理论学习基础——单级PID控制

这是一篇我在学习PID控制算法的过程中的学习记录。在一开始学习PID的时候&#xff0c;我也看了市面上许多的资料&#xff0c;好的资料固然有&#xff0c;但是更多的是不知所云。&#xff08;有的是写的太过深奥&#xff0c;有的则是照搬挪用&#xff0c;对原理则一问三不知&…

【Elasticsearch】function_score与rescore

它们俩都是用来“**干涉评分**”的&#xff0c;但**工作阶段不同、性能开销不同、能做的事也不同**。一句话总结&#xff1a;> **function_score** 在 **第一次算分** 时就动手脚&#xff1b; > **rescore** 在 **拿到 Top-N 结果后** 再“重新打分”。下面把“能干嘛”…