HttpURLConnection no descomprimir Gzip
Estoy tratando de usar HttpURLConnection en Gingerbread + dispositivos Android y estoy teniendo problemas con la codificación gzip. Según la documentación
"En Gingerbread, hemos añadido la compresión de respuesta transparente.HttpURLConnection agregará automáticamente este encabezado a las solicitudes de salida y manejar la respuesta correspondiente:
- Java.io.IOException: No se han encontrado problemas de autenticación
- Cómo detener HttpURLConnection.getInputStream ()?
- HttpURLConnection Post: El flujo de salida no tiene efecto?
- Error de E / S durante la llamada al sistema,
- HTTPURLConnection - POST multipart / form-data con archivo grande con FixedLengthStreamingMode
Aceptar-Codificación: gzip "
El problema es que esto no está sucediendo realmente. El encabezado Accept-Encoding: gzip no se agrega en absoluto. Si lo agrego manualmente, entonces esperaría que la parte de descompresión de él funcione por connection.openInputStream () para devolver automáticamente un GZipInputStream pero sólo devuelve un InputStream normal.
¿Alguien ha experimentado esto? No he visto ningún puesto de este acontecimiento por lo que es muy extraño. El proyecto se compila contra API 17 para que shouldnt ser un problema y el dispositivo está ejecutando 4.3.
Gracias.
- Cómo desconectar una HttpUrlConnection en teléfonos HTC (Froyo y abajo)?
- Adición de legado HTTP a Android Studio
- Android: HttpsUrlConnection con autenticador para la autenticación básica itera siempre cuando la contraseña es incorrecta (en la respuesta 401)
- HttpUrlConnection configuración Rango en Android se ignora
- Cómo detener HttpURLConnection conectar en Android
- DataOutputSteam me está lanzando una 'java.io.IOException: inesperado final de la secuencia'?
- Envío de archivos mediante POST con HttpURLConnection
- HTC Un error? Partes del encabezado HTTP que aparecen en URLConnection InputStream
Tuve el mismo problema y se relacionó con HTTPS . Si llama a:
URL url = new URL("https://www.example.com"); HttpURLConnection conn = (HttpURLConnection) url.openConnection();
En realidad obtiene una instancia de HttpsURLConnection (una subclase de HttpURLConnection) que no maneja gzip automáticamente. En estos casos usted puede:
conn.setRequestProperty("Accept-Encoding", "gzip"); ... InputStream inStream = new GZIPInputStream(conn.getInputStream());
He probado con algunos de mis dispositivos y HttpURLConnection está agregando Accept-Encoding: gzip
a los encabezados.
¿Ha intentado configurar Fiddler para sus dispositivos Android para verificar los encabezados http? Tal vez su servidor no es compatible con la compresión.
He experimentado esto yo mismo y también encontró que funcionó si he añadido el encabezado y GZIPInputStream utilizado manualmente. Sin embargo, estábamos fijando nuestros encabezados manualmente (tenía un encabezado personalizado que tuvimos que añadir).
La documentación de Android dice: "De forma predeterminada, esta implementación de HttpURLConnection solicita que los servidores utilicen compresión gzip." Así que supongo que el valor predeterminado sólo se aplica si no se establecen manualmente los encabezados.
Desde Android Gingerbread (http) e ICS (http + https), cuando usas Http(s)URLConnection
, Android añade el encabezado Accept-Encoding: gzip
automáticamente, pero solo si no lo agregaste primero .
En ese caso, si el servidor devuelve contenido codificado por gzip, automáticamente obtendrá un GZIPInputStream
y el Content-Encoding: gzip
se eliminará de la respuesta. Es por eso que se llama transparente : por lo que el cliente no puede distinguir las respuestas comprimidas o no comprimidas mirando el contenido del flujo o los encabezados.
Si agrega el encabezado Accept-Encoding: gzip
manualmente sin embargo, entonces el manejo transparente de gzip está deshabilitado para esa solicitud y si el servidor devuelve contenido comprimido gzip, entonces necesitará buscar el Content-Encoding: gzip
y crear el GZIPInputStream
Para descomprimir el contenido.