Удалить заголовки из запроса openfeign, установленного по умолчанию http-клиентом

Я вызываю API, который заносит в черный список определенные заголовки HttpHeaders, включая Content-Length, который, по-видимому, предварительно задан HttpClient под spring-openfeign. Чтобы правильно получить ответ API, мне нужно удалить заголовок Content-Length.

Были опробованы следующие обходные пути:

  • Я попытался установить для заголовка значение null или пустую строку, используя доступные аннотации Feign @Headers, @RequestHeaders
  • Я реализовал RequestInterceptor, который создает копию доступной (неизменяемой) карты заголовков, удаляет заголовок из черного списка и устанавливает карту как requestTemplate.headers(newHeaders). Но можно добавлять только новые заголовки, а имеющиеся не изменять (кажутся действительно неизменяемыми ;))
  • Я исследовал переопределение используемого HttpClient, но до сих пор не добился успеха.

Опытные ошибки/проблемы:

API, который я вызываю, возвращает 400 на основе проверки схемы заголовка.

Код:

Если потребуются какие-либо фрагменты кода, я буду рад предоставить их, но мне кажется, что проблема не связана с какой-либо проблемой кода, поскольку я не сталкиваюсь с какими-либо исключениями.

Заранее спасибо!!


person Marian    schedule 13.09.2019    source источник


Ответы (1)


Клиент Apache Http, включенный в feign-httpclient, будет всегда устанавливать заголовок длины содержимого, если присутствует тело запроса. Один из способов решить эту проблему — напрямую настроить клиент Apache и предоставить его Feign через сборщик:

К этому пользовательскому клиенту может быть применен перехватчик Apache Http Client, который позволяет вам изменять запрос после того, как он покинет Feign и до того, как Apache отправит его. Просмотрите свою документацию по Java для получения дополнительной информации.

public class Example {
  public static void main(String[] args) {
    HttpClient httpClient = HttpClients.custom.build();
    GitHub github = Feign.builder()
                     .client(new ApacheHttpClient(httpClient))
                     .target(GitHub.class, "https://api.github.com");
  }
}
person Kevin Davis    schedule 16.09.2019
comment
Я тоже попробовал это. К сожалению, Content-Length также будет добавлен ApacheClient. А пока я считаю, что он всегда добавляется в запросы, когда есть тело запроса. И, честно говоря, для меня это правильное поведение для всех запросов, и я бы обвинил API производителя в том, что он не соответствует стандартам... - person Marian; 17.09.2019