当我们在接口中想获取请求头的值的时候,怎么写代码更简单呢?
SpringMVC 中提供了@RequestHeader 注解,用来获取请求头中的信息。
本文将介绍@RequestHeader 的 4 种用法及原理。
1、预备知识
- 接口测试利器 HTTP Client
- 参数解析器 HandlerMethodArgumentResolver 解密
2、@RequestHeader 介绍
@RequestBody 注解源码如下,可以用来标注在接口的参数上,用来获取 HTTP 请求 header 重要的值,下面通过案例列出常见的 4 种用法。
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestHeader {
/**
* header的名称
*/
@AliasFor("name")
String value() default "";
/**
* 同value,指定header的名称
*/
@AliasFor("value")
String name() default "";
/**
* 是否是必须的,默认为ture,若指定的name在请求中不存在且未指定默认值defaultValue,则会出现异常
*/
boolean required() default true;
/**
* 默认值
*/
String defaultValue() default ValueConstants.DEFAULT_NONE;
}
推荐阅读:尚硅谷 Java 学科全套教程(总 207.77GB)
3、用法 1:指定 name,获取指定的 header
3.1、接口代码
参数使用@RquestHeader 标注,并指定 name 属性的值,可以获取请求头中 name 对应头的值。
test1 方法有 3 个参数:
- name:用来获取头中 name 的值,required 为 false,表示不是必须的,并设置了条件 defaultValue=ready,如果 name 不传递,则默认值为 ready
- age:相当于Integer.parseInt(request.getHeader("age"))
- header1:类型为 List,相当于Arrays.asList(request.getHeaders("header1"))
@RequestMapping("/requestheader/test1")
public Map<String, Object> test1(@RequestHeader(value = "name", required = false, defaultValue = "ready") String name,
@RequestHeader(value = "age") int age,
@RequestHeader(value = "header1") List<String> header1) {
Map<String, Object> result = new LinkedHashMap<>();
result.put("name", name);
result.put("age", age);
result.put("header1", header1);
return result;
}
下面来测试 3 种场景,验证效果
3.2、用例 1:所有 header 都传递
### 所有头都传递
GET http://localhost:8080/chat18/requestheader/test1
name: java
age: 25
header1: java
Header1: spring