流改造的意外结束
unexpected end of stream retrofit
我有一个 Android 应用程序向 Flask 中的 REST API 发出 http 请求。我正在使用带有 okhttp3 的 Retrofit2 向 Raspberry Pi 和 Raspbian Lite 上托管的服务器发出请求。
我的问题是有时我会收到 IOException -> java.net.ProtocolException: unexpected end of stream
但它有时会发生,有时它会完美运行。
http客户端搭建如下:
OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
httpClient.addInterceptor(new Interceptor() {
@NotNull
@Override
public Response intercept(@NotNull Chain chain) throws IOException {
Request original = chain.request();
Request request = original.newBuilder()
.header("User-Agent","myUserAgent")
.header("Connection","close")
.addHeader("Accept-Encoding", "identity")
.method(original.method(),original.body())
.build();
return chain.proceed(request);
}
});
Retrofit retrofit=null;
try {
retrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.client(httpClient.build())
.build();
}catch (Exception e){
//Log.d
}
ApiService API_SERVICE=null;
try{
API_SERVICE = retrofit.create(ApiService.class);
}catch (Exception e){
//Log.d
}
return API_SERVICE;
我尝试过使用和不使用日志记录拦截器,使用 Accept-Encoding: identity 和 Conecction: close。但它不起作用。
答案的Content-Lenght是4339(邮递员标示),拦截器中也标示4339
这是我得到的异常:
我在 Android API 中使用带有模拟器的 Android Studio 28. 我的电脑和树莓派都通过以太网电缆连接到互联网。
我不明白的是为什么有时请求有效而其他时候它直接进入 onFailure。
在服务器上,我总是得到一个 200 代码。请求已处理并且 returns 正确响应。
我还能尝试什么?
看起来像这个问题:https://github.com/square/okhttp/issues/2738。所以试试这个:
任一:
.addHeader("Connection", "close")
或者:
.retryOnConnectionFailure(真)
看来问题出在 Android Studio 模拟器上。我已尝试将我的智能手机连接到 android studio 并在另一部智能手机上安装 APK,但问题没有重现。
我也遇到了这个问题,我发现它只发生在我同时调用 2 个具有 相同 URL 和不同参数的函数(函数 A 和 B)时 .函数 A 获得成功响应后,有时函数 B 收到错误 java.net.ProtocolException: unexpected end of stream
所以我的解决方法是在函数 A 获得成功响应后调用函数 B
retrofit偶尔也会报这个错。服务器端出现 504 网关超时 问题时。所以android这边是没有问题的。这个答案可能对某人有帮助。
我尝试了[这个][ (我的问题是本地主机 IP 192。168.x.x)
转到模拟器的设置 -> 设置 -> 代理 -> Select 手动代理配置 -> 输入您的本地 IP 地址。
我有一个 Android 应用程序向 Flask 中的 REST API 发出 http 请求。我正在使用带有 okhttp3 的 Retrofit2 向 Raspberry Pi 和 Raspbian Lite 上托管的服务器发出请求。 我的问题是有时我会收到 IOException -> java.net.ProtocolException: unexpected end of stream 但它有时会发生,有时它会完美运行。 http客户端搭建如下:
OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
httpClient.addInterceptor(new Interceptor() {
@NotNull
@Override
public Response intercept(@NotNull Chain chain) throws IOException {
Request original = chain.request();
Request request = original.newBuilder()
.header("User-Agent","myUserAgent")
.header("Connection","close")
.addHeader("Accept-Encoding", "identity")
.method(original.method(),original.body())
.build();
return chain.proceed(request);
}
});
Retrofit retrofit=null;
try {
retrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.client(httpClient.build())
.build();
}catch (Exception e){
//Log.d
}
ApiService API_SERVICE=null;
try{
API_SERVICE = retrofit.create(ApiService.class);
}catch (Exception e){
//Log.d
}
return API_SERVICE;
我尝试过使用和不使用日志记录拦截器,使用 Accept-Encoding: identity 和 Conecction: close。但它不起作用。 答案的Content-Lenght是4339(邮递员标示),拦截器中也标示4339 这是我得到的异常:
我在 Android API 中使用带有模拟器的 Android Studio 28. 我的电脑和树莓派都通过以太网电缆连接到互联网。 我不明白的是为什么有时请求有效而其他时候它直接进入 onFailure。 在服务器上,我总是得到一个 200 代码。请求已处理并且 returns 正确响应。 我还能尝试什么?
看起来像这个问题:https://github.com/square/okhttp/issues/2738。所以试试这个:
任一:
.addHeader("Connection", "close")
或者: .retryOnConnectionFailure(真)
看来问题出在 Android Studio 模拟器上。我已尝试将我的智能手机连接到 android studio 并在另一部智能手机上安装 APK,但问题没有重现。
我也遇到了这个问题,我发现它只发生在我同时调用 2 个具有 相同 URL 和不同参数的函数(函数 A 和 B)时 .函数 A 获得成功响应后,有时函数 B 收到错误 java.net.ProtocolException: unexpected end of stream
所以我的解决方法是在函数 A 获得成功响应后调用函数 B
retrofit偶尔也会报这个错。服务器端出现 504 网关超时 问题时。所以android这边是没有问题的。这个答案可能对某人有帮助。
我尝试了[这个][ (我的问题是本地主机 IP 192。168.x.x)
转到模拟器的设置 -> 设置 -> 代理 -> Select 手动代理配置 -> 输入您的本地 IP 地址。