неожиданный конец модернизации потока - PullRequest
0 голосов
/ 02 мая 2020

У меня есть приложение Android, которое отправляет http запросы к REST API в Flask. Я использую Retrofit2 с okhttp3 для отправки запросов на сервер, размещенный на Raspberry Pi с Raspbian Lite. Моя проблема в том, что иногда я получаю IOException -> java. net .ProtocolException: неожиданный конец потока Но это иногда случается, в других случаях это работает отлично. 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. Но это не работает. Длина ответа составляет 4339 (это указывает почтальон), а в перехватчике также указано 4339 Это исключение, которое я получаю:

enter image description here

Я использую Android Studio с эмулятором в Android API 28. И мой p c и Rasberry подключены кабелем ethe rnet к Inte rnet. Чего я не понимаю, так это то, что иногда запрос работает, а иногда - прямо на OnFailure. На сервере я всегда получаю 200 кодов. Запрос обрабатывается и правильно возвращает ответ. что еще я могу попробовать?

Ответы [ 2 ]

0 голосов
/ 08 мая 2020

Похоже, проблема в эмуляторе Android Studio. Я попытался подключить свой смартфон к android studio и установить APK на другой смартфон, и проблема не воспроизводится.

0 голосов
/ 02 мая 2020

Похоже, эта проблема: https://github.com/square/okhttp/issues/2738. Поэтому попробуйте это:

Либо:

.addHeader ("Соединение", "закрыть")

Или: .retryOnConnectionFailure (true)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...