Tengo una comunicación HTTP a un servidor web que solicita datos JSON. Me gustaría comprimir esta secuencia de datos con Content-Encoding: gzip
. ¿Hay alguna manera de configurar Accept-Encoding: gzip
en mi HttpClient? La búsqueda de gzip
en las referencias de Android no muestra nada relacionado con HTTP, como puede ver here.Android: la comunicación HTTP debe usar "Aceptar codificación: gzip"
Respuesta
Debe utilizar cabeceras HTTP para indicar una conexión puede aceptar datos codificados gzip, por ejemplo: respuesta
HttpUriRequest request = new HttpGet(url);
request.addHeader("Accept-Encoding", "gzip");
// ...
httpClient.execute(request);
Comprobar para codificación de contenido:
InputStream instream = response.getEntity().getContent();
Header contentEncoding = response.getFirstHeader("Content-Encoding");
if (contentEncoding != null && contentEncoding.getValue().equalsIgnoreCase("gzip")) {
instream = new GZIPInputStream(instream);
}
Esa es una gran y muy útil respuesta con todos los detalles que necesitaba. Muchas gracias. Un comentario: en lugar de addHeader utilicé setHeader. Por lo que entiendo, esto sobrescribe la "codificación de aceptación" existente si la hay. No estoy seguro de cuál es el enfoque correcto/mejor. Para sobrescribir un encabezado existente para asegurarse de que tiene el valor correcto o para agregarlo en caso de que pueda haber otros encabezados de aceptación de codificación en paralelo. – znq
¿dónde pones el instream entonces? – Mikey
esto no descomprime la solicitud, solo le dice al servidor que puede aceptar una respuesta gzip'd. –
No he usado GZip, pero supongo que debe usar el flujo de entrada de HttpURLConnection
o HttpResponse
como GZIPInputStream
, y no de otra clase específica.
HTTPURLConnection tiene gzip activado por defecto. Solo necesita asegurarse de que su servidor web pueda devolver páginas gzip. http://developer.android.com/reference/java/net/HttpURLConnection.html Pude devolver páginas gzip de php utilizando ob_start ("ob_gzhandler"); – metric152
creo que el ejemplo de código en este enlace es más interesante: ClientGZipContentCompression.java
Están usando HttpRequestInterceptor y HttpResponseInterceptor
muestra para solicitud:
httpclient.addRequestInterceptor(new HttpRequestInterceptor() {
public void process(
final HttpRequest request,
final HttpContext context) throws HttpException, IOException {
if (!request.containsHeader("Accept-Encoding")) {
request.addHeader("Accept-Encoding", "gzip");
}
}
});
muestra para la respuesta:
httpclient.addResponseInterceptor(new HttpResponseInterceptor() {
public void process(
final HttpResponse response,
final HttpContext context) throws HttpException, IOException {
HttpEntity entity = response.getEntity();
Header ceheader = entity.getContentEncoding();
if (ceheader != null) {
HeaderElement[] codecs = ceheader.getElements();
for (int i = 0; i < codecs.length; i++) {
if (codecs[i].getName().equalsIgnoreCase("gzip")) {
response.setEntity(
new GzipDecompressingEntity(response.getEntity()));
return;
}
}
}
}
});
¿Por qué crees que es más interesante? –
@codingcrow Esto es lo que está buscando: _En este caso particular, el cliente HTTP puede hacer una compresión GZIP de contenido transparente agregando dos interceptores de protocolo: un interceptor de solicitud que agrega el encabezado 'Aceptar-Codificar: gzip' a todas las solicitudes salientes y interceptor de respuesta que expande automáticamente las entidades de respuesta comprimidas al envolverlas con una clase de decorador sin comprimir. El uso de interceptores de protocolo hace que la compresión de contenido sea completamente transparente para el consumidor de la interfaz HttpClient._ – clauziere
[Fuente] (http://hc.apache.org/httpcomponents-client-ga/httpclient/examples/org/apache/http/ examples/client/ClientGZipContentCompression.java) – clauziere
Si está usando API de nivel 8 o superior hay AndroidHttpClient.
Tiene métodos auxiliares como:
public static InputStream getUngzippedContent (HttpEntity entity)
y
public static void modifyRequestToAcceptGzipResponse (HttpRequest request)
conduce a código mucho más sucinta:
AndroidHttpClient.modifyRequestToAcceptGzipResponse(request);
HttpResponse response = client.execute(request);
InputStream inputStream = AndroidHttpClient.getUngzippedContent(response.getEntity());
Nice tip the modifyRequest & getUngzipped, también, necesitaba copiar EntityUtils.toString (HttpEntity) para analizar la secuencia no fragmentada como String –
AndroidHttpClient quedó obsoleto en el nivel de API 22. –
Pasé aproximadamente una hora para encontrar la mejor solución. ¡¡¡Esta es la mejor respuesta!!! Gracias – shift66
En mi caso fue así:
URLConnection conn = ...;
InputStream instream = conn.getInputStream();
String encodingHeader = conn.getHeaderField("Content-Encoding");
if (encodingHeader != null && encodingHeader.toLowerCase().contains("gzip"))
{
instream = new GZIPInputStream(instream);
}
- 1. PHP Manual GZip Codificación
- 2. Negociación/compresión de contenido HTTP: ¿utiliza Base64 con Aceptar codificación/Codificación de contenido?
- 3. Twisted http gzip support
- 4. ¿La codificación gzip es compatible con JSON?
- 5. En Python, ¿cómo decodizo la codificación GZIP?
- 6. content-length al usar la compresión http
- 7. Descomprimir la respuesta http comprimida gzip
- 8. compresión gzip de la respuesta de codificación fragmentada?
- 9. manejo automático de las respuestas gzip http en Android
- 10. Este LinearLayout debe usar android: layout_height = "wrap_content"?
- 11. Establecer Vary: Aceptar encabezado de codificación (nginx)
- 12. Android para comunicación node.js
- 13. ¿Cómo puedo aceptar el contenido comprimido gzip usando LWP :: UserAgent?
- 14. GZip en android
- 15. ¿Puedo comprimir solicitudes HTTP usando GZIP?
- 16. ¿Cómo interpretar el encabezado HTTP Aceptar vacío?
- 17. ¿Qué codificación debo usar para un HTTP PUT?
- 18. Comunicación USB con Android/Arduino
- 19. comunicación USB Android
- 20. Comunicación entre Android y PC
- 21. Android UDP Comunicación
- 22. Android: comunicación entre dos dispositivos
- 23. Supervisión de comunicación HTTP en OS X
- 24. secuencia em-http con autenticación básica y gzip cuelga
- 25. Codificación URL en Android
- 26. Perl - HTTP :: Captura de proxy Comunicación XHR/JSON
- 27. Detectando la codificación de caracteres de una solicitud HTTP POST
- 28. ¿Cree que el usuario debe aceptar los términos de servicio?
- 29. Usar respuestas GZIP, JSON y JQuery
- 30. comunicación android entre dos aplicaciones
[Android-WebRequest] (https://github.com/delight-im/Android-WebRequest) admite GZIP y respuestas sin comprimir automáticamente, p. Ej. con 'new WebRequest(). get(). to (" http://www.example.com/ ") .askForGzip (true) .executeSync()'. Específicamente, el método [parseResponse (...)] (https://github.com/delight-im/Android-WebRequest/blob/master/src/im/delight/android/webrequest/WebRequest.java) debería ser lo que estas buscando. – caw