HTTP失败:java.io.IOException:发出https请求时流意外结束异常

问题描述 投票:1回答:1

我们以前使用的是http api,现在我们已迁移到https,并且使用相同的代码,我们面临着HTTP FAILED异常:java.io.IOException:流的意外结束(这适用于某些设备和某些网络调用)。我们正在使用OkHttp和来自Android应用程序的Retrofit。下面是我们的代码

@Provides
    @ApplicationScope
    OkHttpClient provideOkHttpClientV2(
            HttpLoggingInterceptor logging,
            Interceptor headerInterceptor) {
    OkHttpClient.Builder builder = new OkHttpClient.Builder();

    //Removed custom timeout units
    return builder.addInterceptor(headerInterceptor)
            .addInterceptor(logging)
            .retryOnConnectionFailure(true)
            .readTimeout(100, TimeUnit.SECONDS)
            .connectTimeout(100, TimeUnit.SECONDS)
            .build();

 }

@Provides
@ApplicationScope
Interceptor provideRetrofitHeaderV2(final SharedPreferencesUtil sharedPreferencesUtil) {
    return new Interceptor() {
        @Override
        public Response intercept(Chain chain) throws IOException {
            Request original = chain.request();

            Request.Builder builder = original.newBuilder();
            builder.header("Content-Type", "application/json")
                    .method(original.method(), original.body());
            if (sharedPreferencesUtil != null) {
                if (sharedPreferencesUtil.isLogin()) {

                    String loginToken = sharedPreferencesUtil.getLoginToken();
                    builder.addHeader("Authorization", "Bearer " + loginToken);
                }
            }

            builder.addHeader("Connection", "close");

            Request request = builder.build();
            return chain.proceed(request);
        }
    };
}

@Provides
@ApplicationScope
HttpLoggingInterceptor provideLoggingInterceptorV2() {
    HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
    if (BuildConfig.DEBUG) {
        logging.setLevel(HttpLoggingInterceptor.Level.BODY);
    } else {
        logging.setLevel(HttpLoggingInterceptor.Level.NONE);
    }
    return logging;
}

@Provides
@ApplicationScope
Retrofit provideRetrofitV2(OkHttpClient okHttpClient) {
    return new Retrofit.Builder().addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
            .baseUrl(BuildConfig.BASE_URL)
            .client(okHttpClient)
            .build();
}```

我们已经尝试过的事情:

  • addHeader("Connection", "close")添加标题
  • 添加连接池以限制理想的连接
  • 增加超时时间

任何帮助将不胜感激,我们面对这个问题已有相当长的时间。

android retrofit okhttp okhttp3
1个回答
0
投票

我刚发生这种情况,并找到了解决方法。这是由于使用HttpLoggingInterceptor引起的。通过调试okhttp代码,我发现它引发了该错误,因为主体的长度与响应中的内容长度标头不匹配。如果接收到内容标头,则它将使用FixedLengthSource,并且在读取时将引发“意外的流末尾”错误。您可以在源代码https://github.com/square/okhttp/blob/okhttp_3.9.x/okhttp/src/main/java/okhttp3/internal/http1/Http1Codec.java openResponseBody方法

© www.soinside.com 2019 - 2024. All rights reserved.