【Spring】@RequestParam、@RequestBody和@Pathvariable核心解析

41 阅读3分钟

@RequestParam 和 @RequestBody 都是从 HttpServletRequest request 中取参的,而 @PathVariable 是映射 URI 请求参数中的占位符到目标方法的参数中的。另外,前端在不明确指出Content-Type时,默认为 application/x-www-form-urlencoded

1.@RequestParam

(1)核心要点

@RequestParam 的作用是从 HTTP 请求的「请求参数集合」中获取数据,而非根据Content-Type判断是否可用,它的数据来源只有两个

  1. URL 中的查询字符串(Query String):即/api/order?id=1001?后面的键值对;
  2. 表单提交的请求体(仅application/x-www-form-urlencoded格式):即表单提交时,请求体中的key=value&key2=value2格式数据(Spring 会自动解析到请求参数集合中)。

Content-Type: application/json对应的是「请求体中的 JSON 字符串」,@RequestParam本身无法解析 JSON 格式的请求体—— 所以请求方式为 Delete 且Content-Type: application/json时,后端能用@RequestParam接收参数,本质是参数根本不在 JSON 请求体中。

另外,@RequestParam可以获取multipart/form-data这种类型的参数。

(2)方式

GET/POST请求

(3)属性:

  • name:绑定本次参数的名称,要跟URL上的一致。可以不显式说明,如果不写明,默认使用控制器方法的参数名作为请求参数的key来匹配前端传递的参数。
  • required:表示是否必填。如果不写明,默认是true,即该参数为必填项。
  • defaultValue:参数默认值(仅required=false时生效)。
  • value:跟name一样的作用,是name属性的一个别名。

(4)@RequestParam在一个请求中可以使用多次

// 处理GET请求:http://localhost:8080/user?name=张三&age=25 
    @RequestMapping("/user") 
    public String getUser(@RequestParam("name") String username, // 绑定URL参数name到username 
    @RequestParam(value = "age", required = false, defaultValue = "18") Integer age // 可选参数,默认18 ) { 
        return "姓名:" + username + ",年龄:" + age; 
    }

2.@RequestBody

通常后端与前端的交互大多情况下是 POST 请求,尤其是传递大量参数时,毕竟大量参数暴露在浏览的地址栏还是不怎么优雅的,而在 POST 请求中应用 JSON 串对于 Spring MVC 来说是比较友好的,后端使用 @RequestBody 注解就可以方便的实现 JSON 串到接收参数的数据映射。

后端想要接收 JSON 数据有两种方式选择,一种是建立与 JSON 数据与之对应的实体,二是直接使用 Map<String,Object> 对象接收。

说明一下 @RequestBody 为什么不能用用于 GET 请求,RequestBody 顾名思义,是将请求参数设置在请求 Body 中的,也就是请求体,而 GET 请求无请求体

(1)Content-Type

@RequestBody 是用来获取非 application/x-www-form-urlencoded 类型的数据,比如 application/jsonapplication/xml 等。

(2)方式

POST/PUT/PATCH请求

(3)核心特点

  • 一般绑定到实体类对象 / Map<String,Object>类型的对象
  • 一个请求中只能用一次
@PostMapping("/save") 
public void save(@RequestBody User user) { 
    System.out.println(user.getId()); 
}

3.@Pathvariable

@PathVariable 是 Spring MVC 中用于绑定 URL 路径中的动态参数的注解,核心作用是从 URL 路径中提取指定位置的参数值,绑定到控制器方法的参数上。

// 访问:http://localhost:8080/user/1001 
    @GetMapping("/user/{id}") 
    public String getUserById(@PathVariable("id") Long userId) { 
        return "用户ID:" + userId; 
    }

参考文章:(cloud.tencent.com/developer/a…)