Я использую WebClient для получения данных с удаленного сервера. Удаленный сервер способен работать с gzip. Другими словами, если я отправлю запрос GET с «Accept-Encoding: gzip», он вернет сжатый контент. А если контент очень маленький, ответ не сжимается.
Моя проблема связана с WebClient, который по умолчанию не может обрабатывать gzip.
Мой код выглядит следующим образом:
@Bean
WebClient webClient(OAuth2AuthorizedClientManager authorizedClientManager,
@Value("${test.url}") String authUserUri) {
ServletOAuth2AuthorizedClientExchangeFilterFunction oauth2 =
new ServletOAuth2AuthorizedClientExchangeFilterFunction(
authorizedClientManager);
oauth2.setDefaultClientRegistrationId(AUTH_SERVER_OAUTH2_CLIENT_ID);
final int size_mb = 10;
final int size = size_mb * 1024 * 1024;
final ExchangeStrategies strategies = ExchangeStrategies.builder()
.codecs(codecs -> codecs.defaultCodecs().maxInMemorySize(size)).build();
var webClientBuilder = WebClient.builder().apply(oauth2.oauth2Configuration())
.baseUrl(authUserUri);
//Detailed http communication logging for local profile.
if (true) {
webClientBuilder.codecs(configurer -> configurer.defaultCodecs().enableLoggingRequestDetails(true))
.clientConnector(new ReactorClientHttpConnector(
HttpClient.create().wiretap(this.getClass().getCanonicalName(), LogLevel.INFO, AdvancedByteBufFormat.TEXTUAL)));
}
return webClientBuilder.exchangeStrategies(strategies).build();
}
Я изменил webClientBuilder так, чтобы WebClient отправлял «Accept-Encoding: gzip»:
var webClientBuilder = WebClient.builder().apply(oauth2.oauth2Configuration())
.baseUrl(authUserUri).defaultHeaders(httpHeaders -> {
httpHeaders.add("Accept-Encoding", "gzip");
});
В журналах я вижу, что он отправляет этот заголовок. Тело ответа от удаленного сервера выглядит беспорядочным, поэтому я предполагаю, что оно заархивировано, но мой веб-клиент не может его прочитать. Итак, мой вопрос; Как я могу сделать WebClient способным декодировать gzip?
Заменить создание клиента можно здесь:
HttpClient.create().wiretap(this.getClass().getCanonicalName(), LogLevel.INFO, AdvancedByteBufFormat.TEXTUAL)));
к:
HttpClient.create().compress(true);