@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
  • 参数获取情况userId123nameJohn。若 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 对象的 nameJohnage30

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 的配置。
posted @ 2025-06-26 10:58  bigger_apple  阅读(902)  评论(0)    收藏  举报