我有一个用例,我需要将所有以某个前缀开头的标头传递给 feign 客户端。我不知道这些标题的数量或确切名称。似乎没有一种方法可以轻松地做到这一点,因为 Feign 客户端希望所有标头都使用@RequestHeader("name")
. 它似乎不支持类似的东西@RequestHeader HttpHeaders
,这将非常有用。有什么建议么?
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);
}
从文档中,您应该能够为动态标题指定标题映射。
如果标头字段键和值都是动态的,并且可能的键范围无法提前知道,并且可能在同一 api/客户端中的不同方法调用之间发生变化(例如,自定义元数据标头字段,例如“x-amz- meta- ”或“x-goog-meta- ”),可以使用 HeaderMap 对 Map 参数进行注释,以构造一个使用地图内容作为其标题参数的查询。
@RequestLine("POST /")
void post(@HeaderMap Map<String, Object> headerMap);