2

У меня есть прецедент, где мне нужно передать все заголовки, которые начинаются с определенного префикса для фальшивого клиента. Я не знаю числа или точных названий этих заголовков. Кажется, что нет возможности сделать это легко, так как клиент Feign ожидает, что все заголовки будут указаны с помощью @RequestHeader("name"). Кажется, он не поддерживает что-то вроде @RequestHeader HttpHeaders, что было бы очень полезно. Любые предложения?Как передать любое количество заголовков для персонализации клиента, не зная всех имен?

ответ

2

это письмо, Feign не поддерживает динамические заголовки и параметры запроса, используя карту. Клиент Spring Cloud Feign опирается на аннотации Spring вместо аннотаций Feign, а в реализациях AnnotatedParameterProcessor есть ошибка, так что они не выполняют то, что заявляет документация, которую они должны делать.

RequestHeader документ:

Если параметр метод Map, MultiValueMap или HttpHeaders то карта заполняется всеми именами заголовков и значений.

RequestParam документ:

Если параметр метода Map или MultiValueMap и имя параметра не указан, то параметр карты заполняются всеми именами и значений запроса параметров.

Я отправил 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); 
} 
0

Из documentation вы можете указать карту заголовка для динамических заголовков.

В тех случаях, когда оба ключи и значения полей заголовка являются динамическими и диапазон возможных ключей не могут быть известны заранее и могут варьироваться между различными вызовов методов в том же API/клиента (например, поля заголовка пользовательских метаданных, таких как «x-amz-meta- » или «x-goog-meta-»), параметр «Карта» может быть аннотирован с помощью HeaderMap для построения запроса, который использует содержимое карты в качестве параметров заголовка.

@RequestLine("POST /") 
void post(@HeaderMap Map<String, Object> headerMap); 
+0

не работает. Проверьте мой смысл [здесь] (https://gist.github.com/abhijitsarkar/c3ab6269ef92c8f0323ca2a1bf8b8bda), который имеет воспроизводимый код. –