Retrofit + OkHttp + GZIP-ed JSON
Soy nuevo en Retrofit, pero parece realmente poderoso. Todo funciona bien con un JSON normal, pero tan pronto como intento un GZIPed recibo un error:
I / System.out (14883): —— retrofit.RetrofitError: retrofit.converter.ConversionException: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Se esperaba BEGIN_OBJECT pero era STRING en la línea 1 columna 1
- SimpleXML con Retrofit 1.9, 'Atributo' versión 'no tiene una coincidencia en la clase'
- Java.lang.NoClassDefFoundError: io.reactivex.Observable
- ¿Cómo hacer una solicitud de POST utilizando retrofit 2?
- Broken Pipe al intentar cargar una actualización de archivo grande 2
- Cargar archivos en el servidor mediante retroadaptación
Obviamente, los símbolos jeroglíficos que veo en el registro no pueden ser analizados como JSON.
Pensé que okHttp es catchig que gzip cosas correctamente? ¿Qué me estoy perdiendo?
Estos tarros están en mi carpeta libs:
retrofit-1.6.1.jar okhttp-2.0.0.jar gson-2.2.4.jar
De esta manera estoy empezando la llamada:
public interface OvlService { @GET("/gziptest.gz") void getOvls(Callback<OvlWrapper> callback); } ... OkHttpClient okHttpClient = new OkHttpClient(); Executor executor = Executors.newCachedThreadPool(); RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint("http://my.domain") // The base API endpoint. .setLogLevel(RestAdapter.LogLevel.FULL) .setExecutors(executor, executor) .setClient(new OkClient(okHttpClient)) .build(); OvlService ovlService = restAdapter.create(OvlService.class); ovlService.getOvls(new Callback<OvlWrapper>() { @Override public void success(OvlWrapper arg0, Response arg1) { System.out.println("result: " + arg0.toString()); } });
El result:
-line nunca se muestra, pero en su lugar veo muchas de estas cosas T = Mk A G 4. @ A
en el RetrofitLog. ¿Qué hago mal que el gzip no se descomprime? ¡Gracias!
Editar:
Lo probé con un archivo gzip en mi servidor de prueba ( server.com/ovl.gz
) y también lo probé con el servidor api original ( server2.com/api.php?id=ovlgzip
). El mismo resultado, pero diferentes cabeceras:
Servidor de prueba:
HTTP/1.1 200 OK Accept-Ranges: bytes Connection: close Content-Length: 477 Content-Type: application/x-gzip ETag: "2cc40cb-1dd-..." Last-Modified: Tue, 08 Jul 2014 17:00:08 GMT OkHttp-Received-Millis: 1404950522590 OkHttp-Response-Source: NETWORK 200 OkHttp-Selected-Transport: http/1.1 OkHttp-Sent-Millis: 1404950522533 Server: Apache } Qk 0 ...
Servidor original:
HTTP/1.1 200 OK Connection: Keep-Alive Content-Type: application/json Keep-Alive: timeout=4, max=1000 OkHttp-Received-Millis: 1404950697627 OkHttp-Response-Source: NETWORK 200 OkHttp-Selected-Transport: http/1.1 OkHttp-Sent-Millis: 1404950697002 Server: Apache Transfer-Encoding: chunked X-Powered-By: PHP/5.3.3-7+squeeze19 } Qk 0 ...
- Cómo implementar un WebSocket con Retrofit + RX
- Primavera Android Vs Retrofit
- ¿Tenemos alguna posibilidad de detener la solicitud en OkHttp Interceptor?
- Retrofit 2 RxJava - Gson - Deserialización "Global", tipo respuesta de cambio
- Cómo realizar una prueba de unidad
- Error de petición Uber
- Javax.net.ssl.SSLException: Error de lectura: ssl = 0x9524b800: Error de E / S durante la llamada al sistema, Conexión restablecida por pares
- Analizar manualmente parte de una respuesta al utilizar Retrofit
Gracias al comentario de Jake Whartons resultó que la cabecera Content-Encoding: gzip
faltaba. Desde que le dije al servidor para agregar estos encabezados, todo funciona bien:
<?php $data = ...; $gzdata = gzencode($data, 9, FORCE_GZIP); header('Content-Encoding: gzip'); header('Content-Length: '.strlen($gzdata)); ... ?>
Si está descargando un archivo gzip con la extensión .gz , está utilizando apache y tiene mod_mime habilitado. A continuación, puede agregar esta directiva al host virtual o al archivo .htaccess:
AddEncoding gzip .gz
De esta manera, cuando usted está solicitando un archivo con la extensión .gz, apache agregará automáticamente el encabezado "Content-Encoding: gzip" a la respuesta (salida del archivo) y okhttp descodificará automáticamente el cuerpo de la respuesta .