2015-11-24 139 views
17

我想要使用REST服務作爲gzipped編碼JSON的答案。它提供了Content-Encoding: gzip,但我的OkHttp不會將其編碼爲可讀文本,所以JSON轉換器會引發異常。Retrofit和OkHttp 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) 

根據Jake Whartons commentContent-Encoding: gzip頭應該告訴OkHttp對身體進行解碼。

用於創建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); 

的gradle這個依賴關係是:

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

我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

你如何檢索響應數據?可能你正在使用錯誤的方法。 – Antoniossss

+0

我在我的ServiceInterface中添加了GET方法。當我使用Advanced Rest Client執行相同的請求時,一切正常。 –

回答

34

替換此:

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

有了這個:

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

當你提供你自己的Accept-Encoding頭你指示OkHttp要做好自己減壓。通過省略它,OkHttp將負責添加標題和解壓縮。

+1

太棒了,這個作品!非常感謝你! –

+2

但是,如果我省略了「Accept-Encoding:gzip,deflate」,我會得到壓縮響應嗎? – Hakim

+3

是的。如果您省略Accept-Encoding標頭,OkHttp會自動爲您添加自己的解壓縮文件。 –