在Feign客户端+ Spring Cloud中使用带有动态值的@Headers(Brixton RC2)

Has*_*ain 28 spring spring-cloud spring-cloud-netflix

是否可以将动态值设置为标题?

@FeignClient(name="Simple-Gateway")
interface GatewayClient {
    @Headers("X-Auth-Token: {token}")
    @RequestMapping(method = RequestMethod.GET, value = "/gateway/test")
        String getSessionId(@Param("token") String token);
    }
Run Code Online (Sandbox Code Playgroud)

注册RequestInterceptor的实现会添加标头,但无法动态设置标头值

@Bean
    public RequestInterceptor requestInterceptor() {

        return new RequestInterceptor() {

            @Override
            public void apply(RequestTemplate template) {

                template.header("X-Auth-Token", "some_token");
            }
        };
    } 
Run Code Online (Sandbox Code Playgroud)

我在github上发现了以下问题,其中一个评论者(lpborges)试图在@RequestMapping注释中使用标题做类似的事情.

https://github.com/spring-cloud/spring-cloud-netflix/issues/288

亲切的问候

Has*_*ain 51

解决方案是使用@RequestHeader注释而不是假设特定注释

@FeignClient(name="Simple-Gateway")
interface GatewayClient {    
    @RequestMapping(method = RequestMethod.GET, value = "/gateway/test")
    String getSessionId(@RequestHeader("X-Auth-Token") String token);
}
Run Code Online (Sandbox Code Playgroud)


Car*_*der 15

@RequestHeader 对我不起作用。有效的是:

@Headers("X-Auth-Token: {access_token}")
@RequestLine("GET /orders/{id}")
Order get(@Param("id") String id, @Param("access_token") String accessToken);
Run Code Online (Sandbox Code Playgroud)

  • `@RequestHeader` 是一个 Spring Annotation,在使用 OpenFeign 时应该使用 `@Headers + @Param`。 (8认同)

vij*_*jay 12

@HeaderMap、@Header 和 @Param 对我不起作用,下面是使用 FeignClient 传递多个标头参数时使用 @RequestHeader 的解决方案

@PostMapping("/api/channelUpdate")
EmployeeDTO updateRecord(
      @RequestHeader Map<String, String> headerMap,
      @RequestBody RequestDTO request);
Run Code Online (Sandbox Code Playgroud)

调用代理的代码如下:

Map<String, String> headers = new HashMap<>();
headers.put("channelID", "NET");
headers.put("msgUID", "1234567889");
ResponseDTO response = proxy.updateRecord(headers,requestDTO.getTxnRequest());
Run Code Online (Sandbox Code Playgroud)