6

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

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

接受编码:gzip"

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

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

谢谢。

4

4 回答 4

14

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

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

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

conn.setRequestProperty("Accept-Encoding", "gzip");
...
InputStream inStream = new GZIPInputStream(conn.getInputStream());
于 2014-12-31T12:05:56.333 回答
3

由于 Android Gingerbread (http) 和 ICS (http + https),​​当您使用 时Http(s)URLConnection,Android 会Accept-Encoding: gzip自动添加 header,但前提是您没有先自己添加

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

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

于 2017-02-20T13:49:08.567 回答
2

我自己也经历过这种情况,并且发现如果我添加标题并手动使用 GZIPInputStream 就可以了。但是,我们手动设置了标题(我们必须添加一个自定义标题)。

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

于 2014-02-13T20:23:48.173 回答
2

我用我的一些设备进行了测试,HttpURLConnection 正在添加Accept-Encoding: gzip到标题中。

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

于 2013-09-19T15:47:35.287 回答