Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Retrofit and OkHttp gzip decode

The REST service I want to consume answers as a gzipped encoded JSON. It provides the Content-Encoding: gzip, but my OkHttp does not encode it to readable text, so the JSON converter throws an exception.

---> 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) 

According to Jake Whartons comment the Content-Encoding: gzip Header should tell OkHttp to decode the body.

The code for creating the RestAdapter is:

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); 

The gradle dependencies are:

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

The method in my 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); 
like image 713
Simon Tenbeitel Avatar asked Nov 24 '15 09:11

Simon Tenbeitel


1 Answers

Replace this:

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

With this:

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

When you provide your own Accept-Encoding header you’re instructing OkHttp that you want to do your own decompression. By omitting it, OkHttp will take care of both adding the header and the decompression.

like image 117
Jesse Wilson Avatar answered Sep 18 '22 01:09

Jesse Wilson