HttpURLConnection没有解压缩Gzip

时间:2013-09-19 15:31:45

标签: android gzip httpurlconnection

我正在尝试在Gingerbread + Android设备上使用HttpURLConnection,并且遇到gzip编码问题。根据文件

  

“在Gingerbread中,我们添加了透明的响应压缩。   HttpURLConnection会自动将此标头添加到传出   请求,并处理相应的响应:

     

Accept-Encoding:gzip“

问题是这实际上并没有发生。 Accept-Encoding:gzip标头根本没有添加。如果我手动添加它,我会期望它的解压缩部分通过connection.openInputStream()来自动返回GZipInputStream,但它只返回一个普通的InputStream。

有没有人经历过这个?我没有看到任何这种情况发生的帖子,所以很奇怪。该项目是针对API 17编译的,因此不应该是一个问题,设备运行4.3。

感谢。

4 个答案:

答案 0 :(得分:11)

我遇到了同样的问题,它与 HTTPS 有关。如果你打电话:

URL url = new URL("https://www.example.com");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();

你实际上得到了一个HttpsURLConnection(HttpURLConnection的子类)的实例,它不会自动处理gzip。 在这些情况下,您可以:

conn.setRequestProperty("Accept-Encoding", "gzip");
...
InputStream inStream = new GZIPInputStream(conn.getInputStream());

答案 1 :(得分:1)

我测试了一些设备,HttpURLConnection正在向标头添加Accept-Encoding: gzip

您是否为Android设备尝试configuring Fiddler验证http标头?也许您的服务器不支持压缩。

答案 2 :(得分:1)

我自己也经历过这一点,并且发现如果我添加了标题并手动使用了GZIPInputStream,它也能正常工作。但是,我们手动设置了标头(我们必须添加一个自定义标头)。

Android文档说“默认情况下,HttpURLConnection的这种实现请求服务器使用gzip压缩。”所以我猜测默认仅适用于您不手动设置标题的情况。

答案 3 :(得分:1)

自Android Gingerbread(http)和ICS(http + https)以来,当您使用Http(s)URLConnection时,Android会自动添加Accept-Encoding: gzip标头,但前提是您没有自己添加第一

在这种情况下,如果服务器返回gzip编码的内容,您将自动获得GZIPInputStream,并且Content-Encoding: gzip标题将从响应中删除。这就是为什么它被称为透明:所以客户端无法通过查看流内容或标题来区分压缩或未压缩响应之间的区别。

如果您自己手动添加Accept-Encoding: gzip标头,则对该请求禁用透明gzip处理,如果服务器返回gzip压缩内容,则需要查找Content-Encoding: gzip标头和自己创建GZIPInputStream以解压缩内容。