这是一个方法
@PostMapping("/aaa/{code}")
public JsonResult<Object> download(@PathVariable("code") String code,
@RequestAttribute("user_id") String userId,
@RequestParam("token") String token,throws IOException {
//add something
}
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格式。