首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Retrofit + OkHttp处理gzip响应的OkHttp

用Retrofit + OkHttp处理gzip响应的OkHttp
EN

Stack Overflow用户
提问于 2015-02-20 01:45:34
回答 2查看 2K关注 0票数 2

我正在尝试处理来自我的web服务的gzipped响应,但是我总是得到EOFException:源耗尽的过早的

以下是我的库的版本:

代码语言:javascript
复制
retrofit: 1.9.0
okhttp: 2.2.0
okhttp-urlconnection: 2.2.0
gson: 2.3.1

下面是我的代码和输出:

代码语言:javascript
复制
RestAdapter restAdapter = new RestAdapter.Builder()
    .setLogLevel(RestAdapter.LogLevel.FULL)
    .setClient(new OkClient(new OkHttpClient()))
    .setEndpoint("http://myserver.com/services")
    .build();

... 

@GET("/mobile/user/new") 
String registerNewAccount();

由Charles注册的请求(调试代理)

代码语言:javascript
复制
GET /services/mobile/user/new HTTP/1.1
User-Agent: Dalvik/1.6.0 (Linux; U; Android 4.3; GT-I9300 Build/JSS15J)
Host: myserver.com
Connection: Keep-Alive
Accept-Encoding: gzip

查尔斯登记的答复

代码语言:javascript
复制
HTTP/1.1 200 OK
Date    Fri, 20 Feb 2015 00:47:13 GMT
Server  Apache-Coyote/1.1
Content-Encoding    gzip
Content-Type    application/json
Content-Length  32
Via 1.1 myserver.com
Keep-Alive  timeout=5, max=100
Connection  Keep-Alive

改造日志输出

代码语言:javascript
复制
<--- HTTP 200 http://myserver.com/services/mobile/user/new (666ms)
Date: Fri, 20 Feb 2015 00:59:44 GMT
Server: Apache-Coyote/1.1
Content-Type: application/json
Via: 1.1 myserver.com
Keep-Alive: timeout=5, max=100
Proxy-Connection: Keep-alive
OkHttp-Selected-Protocol: http/1.1
OkHttp-Sent-Millis: 1424393970658
OkHttp-Received-Millis: 1424393971268

---- ERROR http://myserver.com/services/mobile/user/new
java.io.EOFException: source exhausted prematurely
    at okio.InflaterSource.read(InflaterSource.java:77)
    at okio.GzipSource.read(GzipSource.java:80)
    at okio.RealBufferedSource$1.read(RealBufferedSource.java:298)
    at java.io.InputStream.read(InputStream.java:163)
    at retrofit.Utils.streamToBytes(Utils.java:43)
    at retrofit.Utils.readBodyToBytesIfNecessary(Utils.java:81)
    at retrofit.RestAdapter.logAndReplaceResponse(RestAdapter.java:483)
    at retrofit.RestAdapter.access$500(RestAdapter.java:107)
    at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:338)
    at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:240)
    at $Proxy0.registerNewAccount(Native Method)
    at com.myapp.tasks.RegisterUserTask.doInBackground(RegisterUserTask.java:36)
    at com.myapp.tasks.RegisterUserTask.doInBackground(RegisterUserTask.java:19)
    at android.os.AsyncTask$2.call(AsyncTask.java:287)
    at java.util.concurrent.FutureTask.run(FutureTask.java:234)
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
    at java.lang.Thread.run(Thread.java:841)
D/Retrofit(9508): ---- END ERROR

如有任何帮助,我们将不胜感激:)

EN

回答 2

Stack Overflow用户

发布于 2015-03-15 20:32:25

当您使用curl尝试相同的请求时会发生什么?确保使用--compressed启用响应压缩。如果我猜的话,我怀疑正在与您交谈的服务器发送的是未压缩长度的Content-Length;他们应该将其设置为压缩长度。

票数 0
EN

Stack Overflow用户

发布于 2022-08-19 08:50:54

添加它应该工作的下列标题:

代码语言:javascript
复制
@Headers("Accept-Encoding: identity")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28620370

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档