@RequestHeader 和 @RequestAttribute 使用场景和区别

背景:

Swagger版本:3.0.0
SpringBoot版本: 2.7.1
最近项目中遇到需要在controller 层 获取header 中 参数的场景。一开始使用@RequestAttribute  接收参数,后续断点发现无法接收header中参数。且@RequestAttribute  和 @RequestBody 注解结合使用时,会出现swagger 注解@ApiModel 失效的问题,导致请求体在swagger-UI中不显示。改为@RequestHeader 后该失效问题得到解决。

下面讲讲这两个注解的使用场景。

1、@RequestHeader

使用场景将请求头中的参数值映射到控制器的参数中
  Spring MVC提供了 @RequestHeader注解,其作用是将请求头中的参数值映射到控制器的参数中。常用属性如下:

name:header值被绑定到的参数名称(The name of the request header to bind to)。只有此属性时,可以省略name,简写为@RequestHeader(“host”)。
required:boolean类型,默认为true,即请求头中必须包含此参数
defaultParameter:为请求头中的参数提供默认值,如果拿不到之,就将此值赋给控制器的参数。

2、@RequestAttribute

使用场景从request中取对应的属性值。 注意:属性和参数是不同的。

很多小伙伴可能对 参数(parameter)和属性(Attribute)的区别不是很了解。简单一句话,参数是需要用户或者浏览器传,属性是我们拦截请求写入或者修改的。比如:httpServletRequest.setAttribute(name, value))
如果我们想在controller层中获取绑定属性值到一个参数,此时就可以使用@RequestAttribute,
具体了解参数(parameter)和属性(Attribute)的区别参考下文:

参数(parameter)和属性(Attribute)的区别

我们一般前后端分离开发每次请求都会携带一些固定的参数,例如: 租户id,坐席 id,我们会将这些固定参数放在 header 中,这时我们就可以使用过滤器来拦截请求,然后将取到的参数可以放到 request 或者 session 作用域中,在 controller 中我们就可以使用 @RequestAttribute 或者 @SessionAttribute 注解来获取值

@RequestAttribute注解的参数在项目里是自己解析出来的,并不是前端传递的。
具体一点,在项目里的拦截器里会对Token信息进行解析,解析出来的参数重新放在请求里(用httpServletRequest.setAttribute(name, value)),后边接口接收参数时就用这个注解。

接下来这句话很重要:@RequestAttribute只负责从request里面取属性值,至于你什么时候往里放值,是有多种方式的可以达到的:

1、@ModelAttribute注解预存
2、HandlerInterceptor拦截器中预存
3、请求转发带过来

扩展

在写http接口的时候,发现接口参数有两种注解,一种是@RequestAttribute,一种是@Requestparam,自己刚开始没明白区别,用postman调试的时候一直报错,后来才发现这个问题。

@RequestAttribute注解的参数在项目里是自己解析出来的,并不是前端传递的。具体一点,在项目里的拦截器里会对Token信息进行解析,解析出来的参数重新放在请求里(用httpServletRequest.setAttribute(name, value)),后边接口接收参数时就用这个注解。
@RequestParam注解则表示这个参数是通过前端传递过来的,如果请求里没有这个参数,则会报错400 Bad Request。这个注解用来解析请求路径里的参数(get请求)或者post请求中form表单格式的请求参数;
@RequestBody注解用来接收POST请求BODY里的参数,格式为JSON格式。

具体可参考下文:
https://blog.csdn.net/forthenight996/article/details/122746305
https://blog.csdn.net/HSH205572/article/details/85295622

https://blog.csdn.net/weixin_45614626/article/details/108510486?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-108510486-blog-122746305.pc_relevant_multi_platform_whitelistv2&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-108510486-blog-122746305.pc_relevant_multi_platform_whitelistv2&utm_relevant_index=1

  • 15
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值