You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:48:14