2015-11-24 15 views
17

Il servizio REST che desidero utilizzare come risposta come JSON codificato con gzip. Fornisce lo Content-Encoding: gzip, ma il mio OkHttp non lo codifica in testo leggibile, quindi il convertitore JSON genera un'eccezione.Retrofit e OkHttp decodifica gzip

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

Secondo Jake Whartons comment il Content-Encoding: gzip Header dovrebbe dire OkHttp per decodificare il corpo.

Il codice per creare la RestAdapter è:

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

Le dipendenze Gradle sono:

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

Il metodo nel mio 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); 
+0

E come si recuperano i dati di risposta? Probabilmente stai usando un metodo sbagliato. – Antoniossss

+0

Ho aggiunto il metodo GET nel mio ServiceInterface. Quando eseguo la stessa richiesta con Advanced Rest Client, tutto funziona correttamente. –

risposta

34

sostituire questo:

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

Con questo:

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

Quando si fornisce il proprio Accept-Encoding intestazione che stai insegnando OkHttp che si vuole fare la propria decompressione. Omettendolo, OkHttp si occuperà sia dell'aggiunta dell'header che della decompressione.

+1

Ottimo, funziona! Grazie mille! –

+2

Ma otterrò una risposta compressa se omesso '" Accept-Encoding: gzip, deflate ",'? – Hakim

+3

Sì. Se ometti l'intestazione Accept-Encoding, OkHttp aggiungerà automaticamente il proprio e decomprimerà per tuo conto. –

Problemi correlati