HttpURLC соединение не распаковывает Gzip

Я пытаюсь использовать HttpURLConnection на устройствах Gingerbread+ Android и у меня проблемы с кодировкой gzip. Согласно документации

"В Gingerbread мы добавили прозрачное сжатие ответов. HttpURLConnection автоматически добавит этот заголовок к исходящим запросам и обработает соответствующий ответ:

Accept-Encoding: gzip "

Проблема в том, что это на самом деле не происходит. Заголовок Accept-Encoding: gzip вообще не добавляется. Если я добавлю его вручную, я буду ожидать, что распаковывающая его часть будет работать с помощью connection.openInputStream(), чтобы автоматически возвращать GZipInputStream, но он просто возвращает простой InputStream.

Кто-нибудь испытывал это? Я не видел никаких сообщений об этом, так что это очень странно. Проект скомпилирован с использованием API 17, поэтому проблем быть не должно, и устройство работает 4.3.

Благодарю.

4 ответа

У меня была такая же проблема, и она была связана с 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());

Начиная с Android Gingerbread (http) и ICS (http + https), когда вы используете Http(s)URLConnectionAndroid добавляет Accept-Encoding: gzip заголовок автоматически, но только если вы не добавили его самостоятельно.

В этом случае, если сервер вернет содержимое в кодировке gzip, вы автоматически получите GZIPInputStream и Content-Encoding: gzip заголовок будет удален из ответа. Вот почему он называется прозрачным: клиент не может определить разницу между сжатыми или несжатыми ответами, просматривая содержимое потока или заголовки.

Если вы добавите Accept-Encoding: gzip Однако вы можете вручную выполнить заголовок, затем прозрачная обработка gzip отключена для этого запроса, и если сервер возвращает сжатый gzip контент, то вам нужно найти Content-Encoding: gzip заголовок и создать GZIPInputStream самостоятельно распаковать контент.

Я протестировал несколько моих устройств, и HttpURLConnection добавляет Accept-Encoding: gzip к заголовкам.

Вы пытались настроить Fiddler для своих устройств Android для проверки заголовков http? Возможно, ваш сервер не поддерживает сжатие.

Я сам испытал это, а также обнаружил, что это работает, если я добавил заголовок и использовал GZIPInputStream вручную. Однако мы настраивали наши заголовки вручную (имел собственный заголовок, который мы должны были добавить).

Документация Android гласит: "По умолчанию эта реализация HttpURLConnection запрашивает, чтобы серверы использовали сжатие gzip". Поэтому я предполагаю, что значение по умолчанию применяется, только если вы не устанавливаете заголовки вручную.

Другие вопросы по тегам