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)URLConnection
Android добавляет 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". Поэтому я предполагаю, что значение по умолчанию применяется, только если вы не устанавливаете заголовки вручную.