【问题标题】:Retrofit OkHttp unexpected end of stream on Connection error改造 OkHttp 在连接错误时意外结束流
【发布时间】:2019-09-20 20:18:23
【问题描述】:

我正在使用以下依赖项(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);
        }
    };

网址是https之一,指向AWS S3实例。

但我收到https URL 端点的以下错误。

java.io.IOException:流意外结束 连接{s3.amazonaws.com:443,代理=DIRECT hostAddress=s3.amazonaws.com/XX.XXX.XXX.XX:443 cipherSuite=none 协议=http/1.1}

经历过类似的话题,如Github discussion 1Github discussion 2,但找不到解决办法。

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

知道可能导致问题的原因吗?


编辑 1:

由于我不确定导致问题的原因,我只是将 OK Http 注释为来自 Retrofit 的客户端。

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

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

任何想为这个问题做出贡献的人,请评论或写一个答案。非常可观!

【问题讨论】:

  • 检查this
  • 我已经在拦截器中有 addHeader("Connection", "close") 。但没有帮助! @Basi
  • @Basi addHeader(...) 是如何解决连接相关问题的?
  • @Sreehari 检查 AWS 服务器设置或配置。您这边没有问题。
  • @MD 感谢您的确认。但我交叉检查了 AWS 方面,没有比 http 更能阻止 https 的特定值。它只是一个文件下载。它在浏览器和其他平台上运行良好......完全失去了:(

标签: android https retrofit2 okhttp


【解决方案1】:

意外结束流问题主要是由于 API 响应中提到的“Content-Length”与 API 的实际大小不匹配。最好联系您的后端开发人员,看看他是否覆盖了内容长度。

【讨论】:

    【解决方案2】:

    自从我编辑我的问题并为其他人提供有效答案以来已经有一个多月了。到目前为止,SO 没有提供任何解决方案,我正在写下解决方案以供将来参考。

    虽然下面的内容不是我想要的,但我可以通过避免OkHttpClient 来获得预期的响应!

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

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

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

    即使这阻止了获取 HTTP 日志,我也可以 获得 HTTPHTTPS 的成功响应。

    【讨论】:

    • 谢谢!但是你能帮忙吗,如何启用日志?以及如何设置读取和连接时间?
    【解决方案3】:

    我将做出贡献,因为我使用 HttpURLConnection 和 OkHttp3 进行了尝试,因为所有 Apache 的东西都已被弃用......并且这两种方法都出现“关闭”连接错误。 我有一个正在测试的简单 bash CGI 脚本。我遵循了那里的每个教程,深入自签名证书的兔子洞,标头中的 utf-8 参数,设置要关闭的连接(再次,标头设置),传递“内容长度”等等。 (所有值得的努力,但不是让我在过去的 4 晚里熬夜的原因)。 我能够连接(我可以在服务器端看到发生了什么),但是每当我尝试从堆栈中弹出内容以读取结果时,我都会收到连接错误。 我的 bash CGI 非常简单。 '内容类型:text/html;'和空白行和一些输出,如“hello world”(所有这些都在浏览器中工作)。 所以。我的建议,因为在这方面没有任何文档或帮助。将您的应用指向 google.com。如果您的应用程序没有错误,那么我会向甜甜圈打赌,这是服务器端的问题。 就我而言(对我而言,这没有任何意义,但确实如此),没有一个解决方案表明这些应用程序方法期望来自网页的所有花里胡哨,这意味着,“头" 和 "body" 并放入一个 "html" 以更好地衡量。

    仅仅因为您的浏览器会正确显示它,并不能保证 api 库能够很好地处理它,所以我会重复一遍.. 将您的应用程序指向一个您可以合理期望格式化的 Web 源,然后从那里拿走。

    【讨论】:

    • 我已经经历了几个相同的线程。在我的试验和错误中发现此问题与 OkHttpClient 客户端库有关。如果没有这个库,改造能够给出预期的输出
    猜你喜欢
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    • 2015-11-16
    • 2020-01-23
    • 2017-11-12
    • 2022-08-24
    • 2013-08-10
    • 2018-01-31
    相关资源
    最近更新 更多