在连接错误时,RETROFIT OKHTTP意外的流终端



我正在使用以下依赖项(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 实例。

但是我会得到https URL终点的以下错误。

java.io.ioexception:流的意外结束 连接{s3.amazonaws.com:443,代理=直接 hostaddress = s3.amazonaws.com/xx.xxx.xxx.xx:443 ciphersuite =无 协议= http/1.1}

经历了类似的线程,例如github讨论1和github讨论2,但找不到分辨率。

如果我将 https 替换为 http ,也没有问题或错误!

任何想法可能导致问题?


编辑1:

由于我不确定是什么原因导致了问题,我只是将http评论为retrofit的客户。

出人意料的错误没有被丢弃。!

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

任何人都想为这个问题做出贡献,请评论或写答案。非常明显!

流问题的意外结束是主要是在API响应中提到的"内容长度"不符合API的实际大小时引起的。更好地联系您的后端开发人员是否覆盖内容长度。

自编辑问题以来已经超过一个月了,并为他人提出了一个注释以给出有效的答案。直到日期,我没有提供解决方案。

尽管以下不是我想要的,但我可以通过避免OkHttpClient

来获得预期的响应。

这是我提到的版本。同样的问题 可能会在以后的版本中发生或可能不会发生。

是的,您正确阅读了它。避免OkHttpClient并单独尝试使用Retrofit

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

即使这阻止了获得HTTP日志,我也能够获得两个 http https 的成功响应

我将做出贡献,因为我尝试使用httpurlconnection和okhttp3尝试了一下,因为所有的apache东西都被弃用了。.并使用这两种方法都遇到了"封闭"连接错误。我有一个简单的Bash CGI脚本,我正在测试。我按照那里的每个教程,从自签名证书的兔子孔,标题中的UTF-8参数,将连接设置为关闭(再次,标题设置(,传递"内容长度"等。(一切都值得一提的努力,但并不是让我过去4晚的原因(。我能够连接(我可以在服务器端看到发生的事情(,但是每当我尝试从堆栈中弹出内容以阅读结果时,我都会遇到连接错误。我的Bash CGI超级简单。" content-type:text/html;"和空白行和一些输出,例如" Hello World"(所有这些都从浏览器中起作用(。所以。我的建议是因为没有任何文档或任何地方有帮助。将您的应用程序指向Google.com。如果您的应用程序没有错误,那么我会押注Donuts的美元,这是服务器端问题。就我而言(对于我的一生而言,这是没有意义的,但确实如此(,没有解决方案表明这些应用程序的方法期望网页上的所有钟声和哨声,这意味着"头"one_answers"身体",并插入" html"。

仅仅因为您的浏览器会正确显示它,因此不能保证API库会处理得当,因此我将重复。然后从那里取它。

最新更新