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



我有一个用例,我需要将所有以特定前缀开头的头传递给虚拟客户端。我不知道这些头部的数量或确切名称。似乎没有一种方法可以轻松地做到这一点,因为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);

相关内容

  • 没有找到相关文章

最新更新