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/json
、application/xml
等。
@RequestParam
这种方式无论是 GET 还是 POST 请求,都是可以获取到参数的,举例中使用了 @RequestParam
注解的一些参数,具体参数如下:
defaultValue
如果本次请求没有携带这个参数,或者参数为空,那么就会启用默认值name
绑定本次参数的名称,要跟URL上面的一样required
这个参数不是必须的,如果为 true,不传参数会报错value
跟name
一样的作用,是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-urlencoded
、form-data
格式数据的,@RequestBody 用来获取非 application/x-www-form-urlencoded
数据的,比如 application/json
、application/xml
等。
3、一个方法中,可以同时使用多个 @RequestParam ,但是只能使用一个 @RequestBody,否则会报错。
4、@PathVariable 起到的作用就是 URI 请求参数中的占位符到目标方法参数的映射。
5、前端请求的 Content-Type ,默认值为 application/x-www-form-urlencoded
,在这种格式下,后端直接使用 @RequestParam 就可以直接获取指定的参数,但是一旦前端传递的是 JSON 数据,也就是 Content-Type 的值为 application/json
,那么使用 @RequestParam 是取不到值的,不但取不到值还报错。