with okhttpclient java retrofit okhttp

okhttpclient - retrofit java server



Retrofit y OkHttp gzip decode (1)

El servicio REST quiero consumir respuestas como un JSON codificado en formato gzip. Proporciona el Content-Encoding: gzip , pero mi OkHttp no lo codifica en texto legible, por lo que el convertidor JSON lanza una excepción.

---> HTTP GET https://rapla.dhbw-karlsruhe.de/rapla/events?resources=%5B%27rc85dbd6-7d98-4eb7-a7f6-b867213c73d8%27%5D&start=2015-09-01&end=2015-12-31 Accept-Encoding: gzip, deflate Accept: application/json Authorization: *not posted* Content-Type: application/json;charset=utf-8 ---> END HTTP (no body) <--- HTTP 200 https://rapla.dhbw-karlsruhe.de/rapla/events?resources=%5B%27rc85dbd6-7d98-4eb7-a7f6-b867213c73d8%27%5D&start=2015-09-01&end=2015-12-31 (13ms) Date: Tue, 24 Nov 2015 09:09:10 GMT Server: Jetty(9.2.2.v20140723) Expires: Tue, 01 Jan 1980 00:00:00 GMT Pragma: no-cache Cache-Control: no-cache, must-revalidate Content-Encoding: gzip Content-Type: application/json; charset=utf-8 Content-Disposition: attachment Content-Length: 9684 Via: 1.1 rapla.dhbw-karlsruhe.de Keep-Alive: timeout=5, max=99 Connection: Keep-Alive OkHttp-Selected-Protocol: http/1.1 OkHttp-Sent-Millis: 1448356149978 OkHttp-Received-Millis: 1448356149991 ����WK�{��J�`k�_��Z����E�p�>3m�WMa�ג�ҵ�p�0��<�� ... skipped rest of the body E��>���S���n <--- END HTTP (9684-byte body)

De acuerdo con el comentario de Jake Whartons, el Encabezado Content-Encoding: gzip debería decirle a OkHttp que decodifique el cuerpo.

El código para crear el RestAdapter es:

final RestAdapter adapter = new RestAdapter.Builder() .setEndpoint(baseUrl) .setClient(new OkClient(new OkHttpClient())) .setConverter(new GsonConverter(gson)) .setLogLevel(RestAdapter.LogLevel.FULL) .build(); service = adapter.create(RaplaService.class);

Las dependencias de Gradle son:

compile ''com.squareup.retrofit:retrofit:1.9.0'' compile ''com.squareup.okhttp:okhttp:2.6.0''

El método en mi ServiceInterface:

@Headers({ "Accept-Encoding: gzip, deflate", "Content-Type: application/json;charset=utf-8", "Accept: application/json" }) @GET("/events") List<Event> getEvents(@Header("Authorization") String token, @Query("resources") String resources, @Query("start") String start, @Query("end") String end);


Reemplace esto:

@Headers({ "Accept-Encoding: gzip, deflate", "Content-Type: application/json;charset=utf-8", "Accept: application/json" })

Con este:

@Headers({ "Content-Type: application/json;charset=utf-8", "Accept: application/json" })

Cuando proporciona su propio encabezado Accept-Encoding le está indicando a OkHttp que desea hacer su propia descompresión. Al omitirlo, OkHttp se encargará de agregar el encabezado y la descompresión.