У меня есть прецедент, где мне нужно передать все заголовки, которые начинаются с определенного префикса для фальшивого клиента. Я не знаю числа или точных названий этих заголовков. Кажется, что нет возможности сделать это легко, так как клиент Feign ожидает, что все заголовки будут указаны с помощью @RequestHeader("name")
. Кажется, он не поддерживает что-то вроде @RequestHeader HttpHeaders
, что было бы очень полезно. Любые предложения?Как передать любое количество заголовков для персонализации клиента, не зная всех имен?
ответ
это письмо, 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);
}
Из documentation вы можете указать карту заголовка для динамических заголовков.
В тех случаях, когда оба ключи и значения полей заголовка являются динамическими и диапазон возможных ключей не могут быть известны заранее и могут варьироваться между различными вызовов методов в том же API/клиента (например, поля заголовка пользовательских метаданных, таких как «x-amz-meta- » или «x-goog-meta-»), параметр «Карта» может быть аннотирован с помощью HeaderMap для построения запроса, который использует содержимое карты в качестве параметров заголовка.
@RequestLine("POST /")
void post(@HeaderMap Map<String, Object> headerMap);
не работает. Проверьте мой смысл [здесь] (https://gist.github.com/abhijitsarkar/c3ab6269ef92c8f0323ca2a1bf8b8bda), который имеет воспроизводимый код. –