连接错误时,更新OkHttp意外结束流

人气:725 发布:2022-10-16 标签: https android okhttp retrofit2

问题描述

我正在使用以下依赖项(Retrofit和OkHttp)。

implementation 'com.squareup.retrofit2:retrofit:2.3.0'
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
implementation 'com.squareup.okhttp3:okhttp:3.10.0'
implementation 'com.squareup.okhttp3:logging-interceptor:3.10.0'

以下是我的代码:

OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .addInterceptor(cache_interceptor)
                .cache(cache)
                .connectTimeout(AppConstants.TIME_OUT, TimeUnit.SECONDS)
                .readTimeout(AppConstants.TIME_OUT, TimeUnit.SECONDS)
                .writeTimeout(AppConstants.TIME_OUT, TimeUnit.SECONDS)
                .connectionSpecs(Collections.singletonList(ConnectionSpec.CLEARTEXT))
                .retryOnConnectionFailure(false)
                .build();

return new Retrofit.Builder()
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .client(okHttpClient)
                .addConverterFactory(ScalarsConverterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .baseUrl(BuildConfig.BASE_URL).build();

private final Interceptor cache_interceptor = new Interceptor() {
        @Override
        public Response intercept(Chain chain) throws IOException {

            Request request = chain.request().newBuilder().addHeader("Connection", "close").build();
            return chain.proceed(request);
        }
    };

该URL为HTTPS,指向AWS S3实例。

但是httpsURL终结点出现以下错误。

Java.io.IOException:上的流意外结束 连接{s3.amazonaws.com:443,代理=直接 HostAddress=s3.amazonaws.com/XX.XXX.XXX.XX:443密码套件=无 协议=http/1.1}

经过了与Github discussion 1和Github discussion 2类似的线程,但找不到解决方案。

如果我将http替换为http,也不会出现问题或错误!!

知道可能是什么原因导致此问题吗?

编辑1:

因为我不确定问题的原因,所以我从Retrofit中注释掉了OK http as Client。

令人惊讶的是,没有抛出错误。!

return new Retrofit.Builder()
                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                    .addConverterFactory(ScalarsConverterFactory.create())
                    .addConverterFactory(GsonConverterFactory.create())
                    .baseUrl(BuildConfig.BASE_URL).build();

任何人想为这个问题做贡献,请发表意见或写下答案。太棒了!

推荐答案

我已经一个多月没有编辑我的问题了,并发布了一个注释以供其他人给出有效的答案。到目前为止,销售经理没有提供任何解决方案,我将解决方案写下来以备将来参考。

虽然下面不完全是我想要的,但我可以通过避免OkHttpClient

来获得预期的响应

这是我提到的版本。同样的问题 可能会出现在将来的发行版本中,也可能不会出现。

是的,你没看错。避免了OkHttpClient,并单独尝试了Retrofit

return new Retrofit.Builder()
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(ScalarsConverterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.baseUrl(BuildConfig.BASE_URL).build();
即使这阻止了获取HTTP日志,我仍然能够 获取HTTP和HTTPS的成功响应。

213