改造和 OkHttp gzip 解码
Retrofit and OkHttp gzip decode
REST 服务我想使用 gzip 编码的答案 JSON。它提供 Content-Encoding: gzip
,但我的 OkHttp 没有将其编码为可读文本,因此 JSON 转换器抛出异常。
---> 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 comment Content-Encoding: gzip
Header 应该告诉 OkHttp 解码 body.
创建 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);
替换为:
@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
header 时,您是在指示 OkHttp 您想要自己进行解压。通过省略它,OkHttp 将负责添加 header 和解压缩。
在我的案例中,我评论了 client(OkHttpClient client)
以下是代码片段
Retrofit.Builder()
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.baseUrl(BuildConfig.END_POINT)
//.client(client)
.build()
因为我用的是LoggingInterceptor
,我想他不会照顾与gzip
相关的一切
REST 服务我想使用 gzip 编码的答案 JSON。它提供 Content-Encoding: gzip
,但我的 OkHttp 没有将其编码为可读文本,因此 JSON 转换器抛出异常。
---> 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 comment Content-Encoding: gzip
Header 应该告诉 OkHttp 解码 body.
创建 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);
替换为:
@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
header 时,您是在指示 OkHttp 您想要自己进行解压。通过省略它,OkHttp 将负责添加 header 和解压缩。
在我的案例中,我评论了 client(OkHttpClient client)
以下是代码片段
Retrofit.Builder()
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.baseUrl(BuildConfig.END_POINT)
//.client(client)
.build()
因为我用的是LoggingInterceptor
,我想他不会照顾与gzip
相关的一切