Android Retrofit 2 gzip错误

时间:2016-09-28 03:28:32

标签: java android retrofit retrofit2

我正在使用retrofit2开发Android应用程序。 gzip有问题,这里是异常堆栈。     我不知道异常究竟发生在哪里。任何建议表示赞赏。感谢。

Unknown exception
java.io.EOFException
   at okio.RealBufferedSource.require(RealBufferedSource.java:64)
   at okio.GzipSource.consumeHeader(GzipSource.java:114)
   at okio.GzipSource.read(GzipSource.java:73)
   at okio.RealBufferedSource.request(RealBufferedSource.java:71)
   at okhttp3.logging.HttpLoggingInterceptor.intercept(HttpLoggingInterceptor.java:225)
   at okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java:187)
   at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:160)
   at okhttp3.RealCall.execute(RealCall.java:57)
   at retrofit2.OkHttpCall.execute(OkHttpCall.java:174)
   at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall.execute(ExecutorCallAdapterFactory.java:89)
   at com.hello.de.aloha.domain.interactor.RetrofitServerInteraction.callVerifyOauthToken(RetrofitServerInteraction.java:424)
   at com.hello.de.aloha.domain.security.SecurityHandshake.validateOAuthToken(SecurityHandshake.java:178)
   at com.hello.de.aloha.domain.security.SecurityHandshake.requestOAuthToken(SecurityHandshake.java:150)
   at com.hello.de.aloha.domain.security.SecurityHandshake.authenticate(SecurityHandshake.java:122)
   at com.hello.de.aloha.domain.security.SecurityHandshake.challenge(SecurityHandshake.java:70)
   at com.hello.de.aloha.domain.interceptor.SecurityInterceptor.determineNewToken(SecurityInterceptor.java:152)
   at com.hello.de.aloha.domain.interceptor.SecurityInterceptor.intercept(SecurityInterceptor.java:89)
   at okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java:187)
   at com.hello.de.aloha.domain.interceptor.SendCookieInterceptor.intercept(SendCookieInterceptor.java:46)
   at okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java:187)
   at com.hello.de.aloha.domain.interceptor.ReceiveCookiesInterceptor.intercept(ReceiveCookiesInterceptor.java:43)
   at okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java:187)
   at com.hello.de.aloha.domain.interceptor.HttpParamInterceptor.intercept(HttpParamInterceptor.java:75)
   at okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java:187)
   at okhttp3.logging.HttpLoggingInterceptor.intercept(HttpLoggingInterceptor.java:203)
   at okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java:187)
   at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:160)
   at okhttp3.RealCall.access$100(RealCall.java:30)
   at okhttp3.RealCall$AsyncCall.execute(RealCall.java:127)
   at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
   at java.lang.Thread.run(Thread.java:818)

1 个答案:

答案 0 :(得分:2)

我已经检查了GzipSource中的代码:

   
    private void consumeHeader() throws IOException {
        // Read the 10-byte header. We peek at the flags byte first so we know if we
        // need to CRC the entire header. Then we read the magic ID1ID2 sequence.
        // We can skip everything else in the first 10 bytes.
        // +---+---+---+---+---+---+---+---+---+---+
        // |ID1|ID2|CM |FLG|     MTIME     |XFL|OS | (more-->)
        // +---+---+---+---+---+---+---+---+---+---+
        source.require(10);
        ...
    }
   
  @Override public void require(long byteCount) throws IOException {
    if (!request(byteCount)) throw new EOFException();
  }

  @Override public boolean request(long byteCount) throws IOException {
    if (byteCount < 0) throw new IllegalArgumentException("byteCount < 0: " + byteCount);
    if (closed) throw new IllegalStateException("closed");
    while (buffer.size < byteCount) {
      if (source.read(buffer, Segment.SIZE) == -1) return false;
    }
    return true;
  }

您的响应数据似乎违反了gzip的格式。因此建议先检查响应数据。您可能还需要检查传入的请求标头,这会影响响应数据格式(即:accept:gzip)。