我有一个用例,我需要将所有以特定前缀开头的头传递给虚拟客户端。我不知道这些头部的数量或确切名称。似乎没有一种方法可以轻松地做到这一点,因为Feign客户端期望使用@RequestHeader("name")
指定所有标头。它似乎不支持像@RequestHeader HttpHeaders
这样非常有用的东西。有什么建议吗?
在撰写本文时,Feign不支持使用Map的动态标头或查询参数。Spring Cloud Feign客户端依赖于Spring注解而不是Feign注解,并且AnnotatedParameterProcessor
的实现有一个bug,使得它们没有按照文档所述做。
RequestHeader医生:
如果方法参数是Map、MultiValueMap或HttpHeaders,则Map用所有头文件的名称和值填充。
RequestParam医生:
如果方法参数为Map或MultiValueMap,并有参数名,则用所有请求填充map参数参数名称和值。
我提交了一个拉请求,将解决这个问题。在此之前,我使用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);
}
从文档中,您应该能够为动态头指定一个头映射。
如果头字段的键和值都是动态的,并且可能的键的范围不能提前知道,并且可能在同一api/客户端中不同的方法调用之间变化(例如自定义元数据头字段,如"x-amz-meta-"或"x-goog-meta-"),则可以使用HeaderMap注释Map参数以构造一个使用Map内容作为其头参数的查询。
@RequestLine("POST /")
void post(@HeaderMap Map<String, Object> headerMap);