如何让Spring Boot中的WebClient支持gzip压缩解码?
解决WebClient处理gzip压缩响应的问题
问题根源:你手动添加了
Accept-Encoding: gzip请求头,但WebClient默认没有配置gzip解码逻辑,导致返回的压缩内容无法被解压,最终显示乱码。正确解决方案:依托Reactor HttpClient的自动压缩能力,它能同时处理两个核心逻辑:
- 自动添加符合要求的
Accept-Encoding请求头 - 自动识别响应的
Content-Encoding: gzip标识,完成内容解压
- 自动添加符合要求的
代码修改方式:在配置
ReactorClientHttpConnector时,给HttpClient添加.compress(true)配置,同时可以移除手动添加的Accept-Encoding头(自动配置更稳妥,能兼容服务器不压缩的场景)。
修改后的完整代码如下:
@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(); // 移除手动添加的Accept-Encoding头,由compress(true)自动处理 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) // 新增:启用自动压缩支持,处理请求头和响应解码 .compress(true))); } return webClientBuilder.exchangeStrategies(strategies).build(); }
- 额外配置说明:如果需要精确控制请求头(比如只指定gzip,不包含其他压缩格式),可以用
.compress(Collections.singletonList("gzip"))替代.compress(true),这样HttpClient会仅添加Accept-Encoding: gzip请求头,同时依然自动完成响应解码。
内容的提问来源于stack exchange,提问作者ilhan
相关产品推荐
相关产品推荐

