我是一个用例,我需要将所有以特定前缀开头的标题传递给假装客户端。我不知道这些标题的数量或确切名称。似乎没有办法轻松地做到这一点,因为Feign客户端期望使用@RequestHeader("name")
指定所有标头。它似乎不支持像@RequestHeader HttpHeaders
这样的东西,这将是非常有用的。
有什么建议?
答案 0 :(得分:2)
在撰写本文时,Feign不支持使用Map的动态标头或查询参数。 Spring Cloud Feign客户端依赖于Spring注释而不是Feign注释,而AnnotatedParameterProcessor
的实现有一个错误,使得它们不会执行文档声明他们应该做的事情。
RequestHeader doc:
如果方法参数是Map,MultiValueMap或HttpHeaders那么 map将填充所有标题名称和值。
RequestParam doc:
如果方法参数是Map或MultiValueMap和参数名称 如果未指定,则使用所有请求填充map参数 参数名称和值。
我提交了pull request来解决这个问题。在此之前,我正在使用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);
}
答案 1 :(得分:0)
从documentation开始,您应该可以为动态标头指定标头地图。
如果标题字段键和值都是动态的,并且可能无法提前知道可能键的范围,并且可能在同一api /客户端中的不同方法调用之间有所不同(例如自定义元数据标题字段,例如&# 34; x-amz-meta- "或" x-goog-meta - "),可以使用HeaderMap注释Map参数以构造使用的查询地图的内容作为其标题参数。
@RequestLine("POST /")
void post(@HeaderMap Map<String, Object> headerMap);