SpringBoot注解@RequestParam @RequestBody @PathVariable

前言

最近在项目上遇到个需求,之前用的post请求,json参数,但是json参数是个数组,现在想要加个参数,我不想在

数组里每个都加一个,一开始想的是我直接在post url后面加个/{id},比如这样的,我们知道Get请求是可以这样的,但是post是不能这样的,否则会报url找不到

解决

@RequestParam@RequestBody 都是从 HttpServletRequest request 中取参的,而 @PathVariable 是映射 URI 请求参数中的占位符到目标方法的参数中的,接下来一一举例说明。

前端在不明确指出 Content-Type 时,默认为 application/x-www-form-urlencoded 格式,@RequestParam 可以获取 application/x-www-form-urlencoded 以及 application/json 这两种类型的参数,但是 @RequestBody 是用来获取非 application/x-www-form-urlencoded 类型的数据,比如 application/jsonapplication/xml 等。

@RequestParam

这种方式无论是 GET 还是 POST 请求,都是可以获取到参数的,举例中使用了 @RequestParam 注解的一些参数,具体参数如下:

  • defaultValue 如果本次请求没有携带这个参数,或者参数为空,那么就会启用默认值
  • name 绑定本次参数的名称,要跟URL上面的一样
  • required 这个参数不是必须的,如果为 true,不传参数会报错
  • valuename一样的作用,是name属性的一个别名

@PathVariable

@PathVariable 也有相应的参数:

  • name 绑定参数的名称,默认不传递时,绑定为同名的形参。 赋值但名称不一致时则报错
  • value 跟name一样的作用,是name属性的一个别名
  • required 这个参数不是必须的,如果为 true,不传参数会报错

使用 @PathVariable 需要注意两点:

  • 参数接收类型使用基本类型
  • 如果@PathVariable标明参数名称,则参数名称必须和URL中参数名称一致
@ReuqestBody(不能用于GET请求)

使用 @RequestBody 注解可以方便的实现 JSON 串到接收参数的数据映射。

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

使用 @RequestBody 需要满足如下条件:

  • Content-Type application/json,确保传递是 JSON 数据;
  • 参数转化的配置必须统一,否则无法接收数据,比如 json、request 混用等
总结

1、在 GET 请求中可以使用 @RequestParam,不能使用 @RequestBody,@RequestBody 是用来获取请求体中的参数,因为 GET 请求没有请求体,所以不能使用。

2、在 POST 请求中,可以使用 @RequestBody 和 @RequestParam ,其中 @RequestParam 是用来获取 application/x-www-form-urlencodedform-data 格式数据的,@RequestBody 用来获取非 application/x-www-form-urlencoded 数据的,比如 application/jsonapplication/xml 等。

3、一个方法中,可以同时使用多个 @RequestParam ,但是只能使用一个 @RequestBody,否则会报错。

4、@PathVariable 起到的作用就是 URI 请求参数中的占位符到目标方法参数的映射。

5、前端请求的 Content-Type ,默认值为 application/x-www-form-urlencoded,在这种格式下,后端直接使用 @RequestParam 就可以直接获取指定的参数,但是一旦前端传递的是 JSON 数据,也就是 Content-Type 的值为 application/json,那么使用 @RequestParam 是取不到值的,不但取不到值还报错。