@HeaderMap 是 Netflix Feign 中的一个注解,主要用于将一个 Map 类型的对象中的键值对作为 HTTP 请求头添加到 Feign 客户端发送的请求中。
在实际应用中,当需要动态地设置请求头,或者根据不同的业务逻辑添加多个自定义请求头时,这个注解非常有用。它提供了一种灵活的方式来传递请求头信息,比如认证令牌、用户代理信息、内容类型等。
假设你有一个服务需要进行纯文本数据交互并且需要传递认证信息。可以像下面这么做:
(1)服务代码:
@GetMapping("/header1") public String header1(@RequestHeader("Custom-Header") String customHeader, @RequestHeader("Authorization") String token, @RequestHeader("Content-Type") String contentType) { return "Custom-Header=" + customHeader + "<br/>Authorization=" + token + "<br/>Content-Type=" + contentType; }
(2)Feign 客户端接口定义:
@RequestLine("GET /simple/header1") String header2(@HeaderMap Map<String,String> headers);
(3)调用 Feign 客户端:
@GetMapping("/") public String index() { Map<String,String> headers = new HashMap<>(); headers.put("Authorization", "Bearer e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"); headers.put("Content-Type", "text/plain"); return SimpleFeign.create().header2(headers); }
输出结果如下:
下面是 @HeaderMap 注解的源码:
package feign; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.PARAMETER}) public @interface HeaderMap { }
从源码看,@HeaderMap 注解仅是一个标记注解,没有提供属性。