使用CloseableHttpAsyncClient获取Gzip压缩内容失败求助
解决CloseableHttpAsyncClient配合AsyncRestTemplate无法获取Gzip压缩内容的问题
我之前也碰到过类似的问题,核心原因是两个关键配置没到位:一是客户端没告诉服务器「我能接受压缩内容」,二是Apache HttpAsyncClient没有启用自动解压响应的功能。下面直接上可运行的解决方案:
1. 配置支持Gzip解压的CloseableHttpAsyncClient
Apache HttpAsyncClient默认不会自动处理压缩响应,需要手动配置请求头和响应解压拦截器。你有两种配置方式可选:
方式一:手动添加拦截器(兼容多数版本)
import org.apache.http.impl.nio.client.CloseableHttpAsyncClient; import org.apache.http.impl.nio.client.HttpAsyncClients; import org.apache.http.protocol.HttpRequestInterceptor; import org.apache.http.protocol.ResponseContentEncoding; // 构建带压缩支持的异步客户端 CloseableHttpAsyncClient asyncHttpClient = HttpAsyncClients.custom() // 添加请求拦截器,自动给请求带上Accept-Encoding头 .addInterceptorLast((HttpRequestInterceptor) (request, context) -> request.addHeader("Accept-Encoding", "gzip, deflate")) // 添加响应解压拦截器,自动解码gzip/deflate格式的响应 .addInterceptorLast(new ResponseContentEncoding()) .build();
方式二:用专用Builder简化配置(Apache HC 4.5+支持)
如果你的HC版本是4.5及以上,可以用AsyncDecompressingHttpClientBuilder自动完成所有压缩相关配置:
import org.apache.http.impl.nio.client.AsyncDecompressingHttpClientBuilder; import org.apache.http.impl.nio.client.CloseableHttpAsyncClient; CloseableHttpAsyncClient asyncHttpClient = AsyncDecompressingHttpClientBuilder.create() .build();
2. 将配置好的客户端注入AsyncRestTemplate
需要把上面的异步客户端包装成Spring兼容的请求工厂,再传给AsyncRestTemplate:
import org.springframework.http.client.HttpComponentsAsyncClientHttpRequestFactory; import org.springframework.web.client.AsyncRestTemplate; // 包装HttpAsyncClient为Spring异步请求工厂 HttpComponentsAsyncClientHttpRequestFactory requestFactory = new HttpComponentsAsyncClientHttpRequestFactory(asyncHttpClient); // 初始化带压缩支持的AsyncRestTemplate AsyncRestTemplate asyncRestTemplate = new AsyncRestTemplate(requestFactory);
3. 测试调用示例
现在用这个配置好的AsyncRestTemplate发起请求,就能直接拿到解压后的明文内容了:
asyncRestTemplate.getForObject("http://localhost:8080/your-target-endpoint", String.class) .addCallback( response -> System.out.println("解压后的响应:" + response), error -> error.printStackTrace() );
关键验证点
如果还是有问题,可以检查这两点:
- 开启HC的日志,确认请求头里确实包含
Accept-Encoding: gzip, deflate - 查看响应头是否有
Content-Encoding: gzip,确认服务器返回了压缩内容
内容的提问来源于stack exchange,提问作者Akshay Patil
相关产品推荐
相关产品推荐

