Я использую следующие зависимости (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);
        }
    };

URL-адрес https и указывает на экземпляр AWS S3 .

Но я получаю следующую ошибку для конечной точки URL https.

java.io.IOException: неожиданное завершение потока на Соединении {s3.amazonaws.com:443, прокси = ПРЯМОЙ hostAddress = s3.amazonaws.com / XX.XXX.XXX.XX: 443 cipherSuite = нет протокол = http / 1.1}

Перешли через похожие темы, такие как Обсуждение Github 1 и Обсуждение Github 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();

Кто-нибудь хочет внести свой вклад в вопрос, пожалуйста, прокомментируйте или напишите ответ. Многое заметно!

3
Sreehari 2 Май 2019 в 13:16

3 ответа

Лучший ответ

Прошло уже больше месяца с тех пор, как я редактировал свой вопрос, и выкладывал заметки, чтобы другие могли дать правильные ответы. До даты, когда SO не предоставил решения, я записываю решение для дальнейшего использования.

Хотя приведенное ниже не совсем то, что я хочу, я смог получить ожидаемый ответ, избегая OkHttpClient!

Да, вы правильно прочитали. Избегали OkHttpClient и пробовали с одним Retrofit.

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

Несмотря на то, что это не позволило получить логи HTTP, я смог получить успешный ответ для HTTP и HTTPS .

1
Sreehari 3 Фев 2020 в 06:25

Я собираюсь внести свой вклад, так как я попробовал это с HttpURLConnection и OkHttp3, так как все содержимое Apache устарело ... и получало «закрытые» ошибки соединения с обоими методами. У меня был простой CGI-скрипт bash, с которым я тестировал. Я следил за каждым уроком, проходил через кроличью нору самозаверяющих сертификатов, параметры utf-8 в заголовке, устанавливая соединения для закрытия (опять же, настройки заголовка), передавая «Content-length» и т. Д. И т. Д. (все стоящие усилия, но не то, что поддерживало меня последние 4 ночи). Я был в состоянии соединиться (я мог видеть на стороне сервера, что происходило), но всякий раз, когда я пытался вытолкнуть материал из стека, чтобы прочитать результаты, я получал ошибку соединения. Мой bash CGI был супер простым. Тип содержимого: text / html; и пустая строка и некоторые выходные данные, такие как «hello world» (все это работает из браузера). Так. Мой совет, так как не было никакой документации или помощи по этому вопросу. Направьте свое приложение на google.com. Если в вашем приложении нет ошибок, я бы поставил доллары на пончики, это проблема на стороне сервера. В моем случае (и для моей жизни это не имеет никакого смысла, но это так), что ни одно из решений не показало, что эти методы приложения ожидают всех наворотов от веб-страницы, что означает «голова» "и" тело "и добавьте" HTML "для хорошей меры.

Тот факт, что ваш браузер будет отображать его правильно, не является гарантией того, что библиотеки API будут хорошо с этим справляться, поэтому я повторюсь ... укажите ваше приложение на веб-источник, который можно разумно ожидать отформатировать, а затем это оттуда.

0
Michael LiVolsi 26 Авг 2019 в 14:14

Непредвиденная проблема конца потока вызвана, в основном, когда «Content-Length», упомянутый в ответе API, не соответствует реальному размеру API. Лучше обратиться к своему бэкэнд-разработчику, если он переопределяет длину контента.

1
Janusz 20 Фев 2020 в 09:11