2

我有一个用例,我需要将所有以某个前缀开头的标头传递给 feign 客户端。我不知道这些标题的数量或确切名称。似乎没有一种方法可以轻松地做到这一点,因为 Feign 客户端希望所有标头都使用@RequestHeader("name"). 它似乎不支持类似的东西@RequestHeader HttpHeaders,这将非常有用。有什么建议么?

4

2 回答 2

2

在撰写本文时,Feign 不支持使用 Map 的动态标头或查询参数。Spring Cloud Feign 客户端依赖于 Spring 注释而不是 Feign 注释,并且其实现AnnotatedParameterProcessor存在一个错误,因此它们没有按照文档中的说明进行操作。

请求头文件:

如果方法参数是 Map、MultiValueMap 或 HttpHeaders,则使用所有标题名称和值填充映射。

请求参数文档:

如果方法参数是 Map 或 MultiValueMap 并且未指定参数名称,则使用所有请求参数名称和值填充 map 参数。

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

@Autowired
FormattingConversionService feignConversionService;

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

@Bean
public Contract feignContract() {
    return new EnhancedSpringMvcContract(feignConversionService);
}
于 2016-09-27T00:11:20.990 回答
0

文档中,您应该能够为动态标题指定标题映射。

如果标头字段键和值都是动态的,并且可能的键范围无法提前知道,并且可能在同一 api/客户端中的不同方法调用之间发生变化(例如,自定义元数据标头字段,例如“x-amz- meta- ”或“x-goog-meta- ”),可以使用 HeaderMap 对 Map 参数进行注释,以构造一个使用地图内容作为其标题参数的查询。

 @RequestLine("POST /")
 void post(@HeaderMap Map<String, Object> headerMap);
于 2016-09-23T11:37:07.400 回答