如何在不知道所有名称的情况下将任意数量的 headers 传递给 Feign 客户端?

How to pass any number of headers to Feign client without knowing all the names?

我有一个用例,我需要将所有以特定前缀开头的 headers 传递给假客户端。我不知道这些 headers 的数量或确切名称。似乎没有办法轻松做到这一点,因为 Feign 客户端希望使用 @RequestHeader("name") 指定所有 headers。它似乎不支持像 @RequestHeader HttpHeaders 这样的东西,这将非常有用。 有什么建议么?

documentation 开始,您应该能够为动态 header 指定一个 header 映射。

In cases where both the header field keys and values are dynamic and the range of possible keys cannot be known ahead of time and may vary between different method calls in the same api/client (e.g. custom metadata header fields such as "x-amz-meta-" or "x-goog-meta-"), a Map parameter can be annotated with HeaderMap to construct a query that uses the contents of the map as its header parameters.

 @RequestLine("POST /")
 void post(@HeaderMap Map<String, Object> headerMap);

截至撰写本文时,Feign 不支持使用 Map 的动态 headers 或查询参数。 Spring Cloud Feign 客户端依赖于 Spring 注释而不是 Feign 注释,并且 AnnotatedParameterProcessor 的实现有一个错误,使得它们没有按照文档说明它们应该做的事情.

RequestHeader 文档:

If the method parameter is Map, MultiValueMap, or HttpHeaders then the map is populated with all header names and values.

RequestParam 文档:

If the method parameter is Map or MultiValueMap and a parameter name is not specified, then the map parameter is populated with all request parameter names and values.

我提交了一个 pull request 来解决这个问题。在那之前,我使用的是 SpringMvcContract 的扩展,它使用我自己的 AnnotatedParameterProcessor 实现。我使用 Feign.Builder 设置自定义 SpringMvcContract 如下:

@Autowired
FormattingConversionService feignConversionService;

@Bean
@Scope(SCOPE_PROTOTYPE)
public Feign.Builder feignBuilder() {
    return HystrixFeign.builder()
            .contract(feignContract());
}

@Bean
public Contract feignContract() {
    return new EnhancedSpringMvcContract(feignConversionService);
}