@requestbody和@requestparam详解
@RequestBody 和 @RequestParam 是 Spring 框架中用于处理 HTTP 请求参数的两个重要注解,二者存在明显差异,下面为你详细介绍。
1. @RequestParam
此注解的用途是从 HTTP 请求的查询参数(URL 的 ?key=value 部分)或者表单数据里获取参数值。
- 适用场景:适用于 GET 请求中的查询参数、POST 请求中的表单数据。
- 关键属性:
value:对应参数的名称。required:该参数是否为必需项,默认为true。defaultValue:当参数不存在时的默认值。
示例:
@GetMapping("/user")
public String getUser(
@RequestParam("id") Long userId, // 对应 URL 中的 ?id=123
@RequestParam(required = false) String name // 可选参数
) {
return "User ID: " + userId + ", Name: " + name;
}
- 请求示例:
GET /user?id=123&name=John - 参数获取情况:
userId为123,name为John。若name未被传递,那么它的值就是null。
2. @RequestBody
该注解的作用是将 HTTP 请求的整个 body 内容按照指定的方式进行转换,例如转换为 JSON、XML 或者其他格式,然后绑定到方法参数上。
- 适用场景:适用于处理 POST、PUT 请求中的 JSON/XML 数据。
- 必要条件:需要搭配
HttpMessageConverter使用,比如 Jackson 用于处理 JSON 数据。
示例:
@PostMapping("/user")
public User createUser(@RequestBody User user) {
// 假设请求的 body 是 JSON:{"name":"John","age":30}
return user; // 返回包含请求数据的对象
}
- 请求示例:
POST /user Content-Type: application/json {"name":"John","age":30} - 参数获取情况:
user对象的name是John,age是30。
3. 核心区别
| 特性 | @RequestParam | @RequestBody |
|---|---|---|
| 数据来源 | 查询参数(URL)或表单数据 | 请求的整个 body 内容 |
| 常见格式 | 键值对(key=value) | JSON、XML 等结构化数据 |
| HTTP 方法 | 适用于 GET、POST 等多种方法 | 通常用于 POST、PUT 方法 |
| 参数类型 | 基本数据类型、字符串等 | 复杂对象(如 Java Bean) |
| 注解位置 | 方法参数上 | 方法参数上 |
4. 使用建议
- 处理简单参数:如果要处理的是 URL 中的查询参数或者表单数据,就使用
@RequestParam。 - 处理复杂对象:要是需要处理 JSON/XML 等复杂的请求体数据,就使用
@RequestBody。 - 组合使用:在同一个方法里,这两个注解可以一起使用。
@PostMapping("/search") public List<User> searchUsers( @RequestParam String keyword, // 查询参数 @RequestBody SearchFilter filter // 请求体中的 JSON 数据 ) { // 处理搜索逻辑 }
5. 常见错误及解决办法
-
错误提示:
415 Unsupported Media Type- 原因:请求的
Content-Type与服务器配置不相符,例如发送 JSON 数据时却使用了application/x-www-form-urlencoded。 - 解决办法:确保请求头中的
Content-Type正确,像发送 JSON 数据时就使用application/json。
- 原因:请求的
-
错误提示:
400 Bad Request- 原因:请求体的格式和目标对象不匹配,例如 JSON 字段和 Java Bean 属性不一致。
- 解决办法:检查对象的属性名、类型以及 Jackson 的配置。

浙公网安备 33010602011771号