【发布时间】:2019-12-25 11:33:51
【问题描述】:
我的 Android 应用程序的一些用户经常遇到网络错误,并显示以下错误消息:"Unexpected end of stream on null".
通过查看其他类似问题,我没有找到任何明确的方法来解决它。我无法重现网络错误。
1) 我没有成功地将Connection=close 附加到请求标头,正如this answer 建议的那样
2) 我没有成功添加.retryOnConnectionFailure(true),正如this answer 建议的那样
3) 我没有成功搜索服务器端问题,正如this answer 建议的那样,但是有网络问题的请求没有出现在 nginx access.log 文件中
这是我如何初始化改造
OkHttpClient okHttpClient = new OkHttpClient().newBuilder()
.connectTimeout(40, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.writeTimeout(30, TimeUnit.SECONDS)
.retryOnConnectionFailure(true)
.build();
Retrofit.Builder retrofitBuilder = new Retrofit.Builder()
.baseUrl(BuildConfig.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.client(okHttpClient);
this.retrofit = retrofitBuilder.build();
这是我的端点定义(在 IUserService.java 中)
@POST("/v2/android/login/phone")
@Headers("Content-Type: application/json;charset=UTF-8;Connection=close")
Call<APIResult<Session>> phoneLogin(@Body APIRequest request);
这是查询端点的方式
userService = retrofit.create(IUserService.class);
Call<APIResult<Session>> call = userService.phoneLogin(request);
call.enqueue(new GenericCallback<>(context, callback));
我们的配置:
Android (Java)
改造 2.3.0:'com.squareup.retrofit2:retrofit:2.3.0'
好的http 3.12.1:'com.squareup.okhttp3:okhttp:3.12.1'
在 AWS Elastic Beanstalk 上运行的服务器,平台:Puma 和 Ruby 2.6 在 64 位 Amazon Linux/2.9.0 上运行
谁能更好地解释问题出在哪里?知道如何在本地重现此问题吗?有什么办法可以解决这个问题?
【问题讨论】:
-
你能提供你的代码的最小工作示例吗?
-
这似乎是this issue,这是 OkHttp 中的一个已知问题。我强烈建议Volley,一个基于谷歌的网络库,我一直在使用很多,没有任何已知问题(Android-K 的大多数客户端,以及少数 L、M、N 客户端)......如果 OkHttp是必须的,那么请尝试在问题中添加堆栈跟踪。
-
你知道是什么情况导致了这个问题
-
能否将Http请求&响应日志(成功和失败情况)也附上header?
-
@Bonatti 我们确实必须使用 Okhttp。我暂时无法提供堆栈跟踪,我会尽快回来提供一个
标签: android retrofit okhttp amazon-elastic-beanstalk aws-ebs