9

我的 Android 应用程序的一些用户经常遇到网络错误,并显示以下错误消息:"Unexpected end of stream on null".

通过查看其他类似问题,我没有找到任何明确的方法来解决它。我无法重现网络错误。

1)我没有成功地附加Connection=close到请求标头,正如这个答案所暗示的那样

2)我没有成功添加.retryOnConnectionFailure(true),因为这个答案表明

3)我没有成功地搜索到服务器端问题,正如 这个答案所暗示的,但是有网络问题的请求没有出现在 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));

我们的配置:

安卓 (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 上运行

谁能更好地解释问题出在哪里?知道如何在本地重现此问题吗?有什么办法可以解决这个问题?

4

2 回答 2

1

从堆栈跟踪中,在评论中,可以看出问题在于:

Caused by java.io.EOFException: \n not found: limit=0 content=…

所以,这是原来的问题。内容的 GZIP 缩减很可能没有按预期执行,或者至少接收器没有预期它,也没有解码。MDN 来源。尝试执行以下操作:

.addHeader("Accept-Encoding", "identity")

如果这不起作用,那么它可能是服务器错误,正如其他 stackoverflow 答案所述。请注意,您应该在另一个工具上测试页面 URL(例如 CURL 或其他工具,以排除服务器问题)

于 2019-09-03T13:05:42.460 回答
0

看起来更像是服务器问题,您可以尝试按照链接的建议将服务器配置为 60 秒(默认)的 keep_alive 超时。

于 2019-08-30T06:05:20.477 回答