注解@RequestParam与@RequestBody的使用场景

Spring MVC注解@RequestParam与@RequestBody详解
本文详细解析了Spring MVC中@RequestParam与@RequestBody注解的使用场景及区别,重点介绍了如何使用@RequestBody处理JSON数据,实现批量数据插入。

 

在这篇文章中:

  • 一、前言
  • 二、@RequestParam
  • 三、@RequestBody
    • 3.1 向表中批量插入数据
    • 3.2 后端解析json数据
  • 四、总结

每一个成功人士的背后,必定曾经做出过勇敢而又孤独的决定。

放弃不难,但坚持很酷~

一、前言

一直有这么一个疑问:在使用postman工具测试api接口的时候,如何使用 json 字符串传值呢,而不是使用 x-www-form-urlencoded 类型,毕竟通过 key-value 传值是有局限性的。假如我要测试批量插入数据的接口呢,使用 x-www-form-urlencoded 方法根本就不适用于这种场景。

那么如何通过postman工具使用json字符串传值呢,这里就引申出来了spring的两个注解:

  • @RequestParam
  • @RequestBody

总而言之,这两个注解都可以在后台接收参数,但是使用场景不一样。继续往下看 ↓

二、@RequestParam

先介绍一下@RequestParam的使用场景:

注解@RequestParam接收的参数是来自requestHeader中,即请求头通常用于GET请求,比如常见的url:http://localhost:8081/spring-boot-study/novel/findByAuthorAndType?author=唐家三少&type=已完结,其在Controller 层的写法如下图所示:

@RequestParam有三个配置参数:

  • required 表示是否必须,默认为 true,必须。
  • defaultValue 可设置请求参数的默认值。
  • value 为接收url的参数名(相当于key值)。

@RequestParam用来处理 Content-Typeapplication/x-www-form-urlencoded 编码的内容,Content-Type默认为该属性。

@RequestParam也可用于其它类型的请求,例如:POST、DELETE等请求。比如向表中插入单条数据,Controller 层的写法如下图所示:

由于@RequestParam是用来处理 Content-Typeapplication/x-www-form-urlencoded 编码的内容的,所以在postman中,要选择body的类型为 x-www-form-urlencoded,这样在headers中就自动变为了 Content-Type : application/x-www-form-urlencoded 编码格式。如下图所示:

但是这样不支持批量插入数据啊,如果改用 json 字符串来传值的话,类型设置为 application/json,点击发送的话,会报错,后台接收不到值,为 null

这时候,注解@RequestBody就派上用场了。继续往下看 ↓

三、@RequestBody

先介绍一下@RequestBody的使用场景:

注解@RequestBody接收的参数是来自requestBody中,即请求体。一般用于处理非 Content-Type: application/x-www-form-urlencoded编码格式的数据,比如:application/jsonapplication/xml等类型的数据。

application/json类型的数据而言,使用注解@RequestBody可以将body里面所有的json数据传到后端,后端再进行解析。

3.1 向表中批量插入数据

举个批量插入数据的例子,Controller层的写法如下图所示:

由于@RequestBody可用来处理 Content-Typeapplication/json 编码的内容,所以在postman中,选择body的类型为row -> JSON(application/json),这样在 Headers 中也会自动变为 Content-Type : application/json 编码格式。body内的数据如下图所示:

批量向表中插入两条数据,这里的 saveBatchNovel()方法已经封装了 JPAsaveAll() 方法。body 里面的 json 语句的 key 值要与后端实体类的属性一一对应。

注意:前端使用$.ajax的话,一定要指定 contentType: "application/json;charset=utf-8;",默认为 application/x-www-form-urlencoded

3.2 后端解析json数据

上述示例是传递到实体类中的具体写法,那么如果传递到非实体类中,body里面的json数据需要怎么解析呢?我们再来看下面这个例子:

在body中,我们还是输入上面的json数据,根据分析,上面的json数据是一个List数组内嵌套着map对象,那么在后台的接收形式可写为 List<Map<String, String>>,具体代码如下图所示:

postman请求:

控制台输出:

得出结论,通过@RequestBody可以解析Body中json格式的数据。

四、总结

注解@RequestParam接收的参数是来自requestHeader中,即请求头通常用于GET请求,像POST、DELETE等其它类型的请求也可以使用。

注解@RequestBody接收的参数是来自requestBody中,即请求体。一般用于处理非 Content-Type: application/x-www-form-urlencoded编码格式的数据,比如:application/jsonapplication/xml等类型的数据。通常用于接收POST、DELETE等类型的请求数据,GET类型也可以适用。

总算把这两个的逻辑理清楚了,postman也会用json传值了!

源码已上传至https://github.com/841809077/spring-boot-study。

<think>首先,用户的问题是基于提供的引用内容,查询如何组合使用@PathVariable、@RequestParam@RequestBody在Spring框架中处理用户相关业务时的示例。用户指定了这些注解的组合使用。 引用内容总结: - 引用[1]:概述了@RequestParam@RequestBody和@PathVariable的用法。 - 引用[2]:详细说明了@PathVariable,用于从URL路径中获取变量。 - 引用[3]:解释了@RequestBody用于接收请求体中的数据(通常是JSON),并提到可以同时使用@RequestBody@RequestParam,但@RequestBody最多一个。 - 引用[4]:给出了@RequestParam使用示例。 用户要求的是组合使用这三个注解的示例,特别是在用户业务场景中,比如用户登录或其他操作。 系统级指令: 1. **行内数学表达式**:使用$...$格式。但在这个问题中,是关于Java和Spring注解的,可能不需要数学表达式。如果涉及任何公式或变量,就用这种格式。 2. **独立公式**:使用$$...$$格式并单独成段。同样,可能不适用。 3. **LaTeX语法正确**:确保任何数学内容正确。 4. **使用中文回答**:整个回答必须用中文。 5. **生成相关问题**:在回答结束时,生成相关问题列表。 6. **引用标识**:在引用的段落末尾自然地添加引用标识,如[^1]。引用来自用户提供的引用列表([^1]到[^4])。 回答结构: - 用户要求回答结构清晰,帮助用户逐步解决问题。 - 我需要提供一个示例代码片段,展示如何组合使用@PathVariable、@RequestParam@RequestBody。 - 基于引用,提供一个Spring Boot控制器方法的示例。 示例构建: - 组合使用场景:想象一个用户资源操作,比如更新用户信息。 - 使用@PathVariable获取用户ID(从URL路径)。 - 使用@RequestParam获取查询参数,比如版本号或过滤条件。 - 使用@RequestBody获取请求体,比如更新的用户数据(JSON格式)。 - 示例代码:创建一个Spring REST控制器方法。 代码格式: - 用户在上次回答中使用了代码块,所以我应该用类似格式。 - 使用中文注释解释代码。 生成相关问题: - 在回答结束时,添加相关问题列表。 引用标识: - 当我提到或基于引用内容时,在段落末尾添加引用标识。 例如,解释@RequestBody时可以引用[^3]。 完整回答结构: 1. **简介**:简要说明组合使用这些注解场景。 2. **示例代码**:提供Java代码示例,展示组合使用。 3. **解释**:逐步解释代码。 4. **注意事项**:基于引用提醒限制,如@RequestBody只能有一个等。 5. **相关问题**:生成相关问题。 相关问题生成: - 基于主题,如: 1. 如何优化这样的组合使用? 2. 常见错误或陷阱? 3. 实际应用场景举例? 最终回答: - 用中文。 - 确保真实可靠:基于Spring框架标准实践。 </think>### @PathVariable、@RequestParam@RequestBody组合使用示例 在Spring框架中,`@PathVariable`、`@RequestParam`和`@RequestBody`常用于构建RESTful API来处理用户相关业务。`@PathVariable`从URL路径中提取变量(如用户ID),`@RequestParam`从查询参数中获取值(如过滤条件),而`@RequestBody`接收请求体中的数据(如JSON格式的用户信息)。这三个注解可以在同一个控制器方法中组合使用,以灵活处理用户业务逻辑[^1][^2][^3]。 以下是一个典型的使用场景示例:**更新用户信息**。假设我们需要通过URL路径指定用户ID,通过查询参数指定更新版本(用于乐观锁),并通过请求体递更新的用户数据(JSON格式)。示例代码基于Spring Boot实现。 ```java import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/api/users") public class UserController { // 组合使用@PathVariable、@RequestParam@RequestBody @PutMapping("/{userId}") // 使用PUT方法更新资源 public ResponseData updateUser( @PathVariable("userId") String userId, // 从URL路径获取用户ID,如/api/users/123 @RequestParam(value = "version", required = false, defaultValue = "1") int version, // 从查询参数获取版本号(可选,默认1) @RequestBody UserUpdateRequest updateRequest // 从请求体获取JSON数据(用户更新信息) ) { // 业务逻辑:验证用户ID和版本,然后更新数据库 if (userId == null || userId.isEmpty()) { throw new IllegalArgumentException("用户ID不能为空"); } // 示例:打印日志并返回响应 System.out.println("更新用户ID: " + userId); System.out.println("版本号: " + version); System.out.println("更新数据: " + updateRequest.toString()); // 假设调用Service层处理业务 User updatedUser = userService.updateUser(userId, version, updateRequest); return new ResponseData("更新成功", updatedUser); } } // 辅助类:定义请求体结构(JSON格式) public class UserUpdateRequest { private String name; private String email; // 省略getter和setter方法 } // 响应封装类 public class ResponseData { private String message; private Object data; // 省略构造器和getter/setter } ``` ### 逐步解释示例 1. **URL结构**: 请求示例:`PUT http://localhost:8080/api/users/123?version=2` - `{userId}` 由`@PathVariable`捕获(例如`123`),用于标识要更新的用户。 - `version` 由`@RequestParam`捕获(例如`2`),可选参数(`required=false`),默认值为1,用于防止并发更新冲突。 2. **请求体**: - `@RequestBody`接收JSON格式的数据,如`{"name": "张三", "email": "zhangsan@example.com"}`。这会被自动反序列化为`UserUpdateRequest`对象[^3]。 3. **组合逻辑**: - `@PathVariable`确保URL路径的动态性(适用于RESTful设计)。 - `@RequestParam`处理附加参数(如版本控制),提高灵活性。 - `@RequestBody`处理复杂数据(如用户对象),支持POST或PUT方法(不能用于GET)。 ### 注意事项 - **@RequestBody限制**:每个方法只能有一个`@RequestBody`,因为它对应整个请求体;而`@RequestParam`可以有多个[^3]。 - **HTTP方法**:`@RequestBody`通常用于POST/PUT/PATCH方法;GET请求不支持请求体,因此无法使用`@RequestBody`。 - **参数验证**:在实际业务中,应添加Spring Validation注解(如`@Valid`)来校验输入数据。 - **性能考虑**:组合使用能简化代码,但过多注解可能增加维护复杂度;建议在用户管理API(如注册、更新、查询)中使用此模式[^4]。 此示例展示了如何高效处理用户业务逻辑,如用户资料更新,结合路径变量、查询参数和请求体数据。引用内容强调了这些注解的兼容性和最佳实践[^1][^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值