Я использую следующие зависимости (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 ответа
Прошло уже больше месяца с тех пор, как я редактировал свой вопрос, и выкладывал заметки, чтобы другие могли дать правильные ответы. До даты, когда 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 .
Я собираюсь внести свой вклад, так как я попробовал это с HttpURLConnection и OkHttp3, так как все содержимое Apache устарело ... и получало «закрытые» ошибки соединения с обоими методами. У меня был простой CGI-скрипт bash, с которым я тестировал. Я следил за каждым уроком, проходил через кроличью нору самозаверяющих сертификатов, параметры utf-8 в заголовке, устанавливая соединения для закрытия (опять же, настройки заголовка), передавая «Content-length» и т. Д. И т. Д. (все стоящие усилия, но не то, что поддерживало меня последние 4 ночи). Я был в состоянии соединиться (я мог видеть на стороне сервера, что происходило), но всякий раз, когда я пытался вытолкнуть материал из стека, чтобы прочитать результаты, я получал ошибку соединения. Мой bash CGI был супер простым. Тип содержимого: text / html; и пустая строка и некоторые выходные данные, такие как «hello world» (все это работает из браузера). Так. Мой совет, так как не было никакой документации или помощи по этому вопросу. Направьте свое приложение на google.com. Если в вашем приложении нет ошибок, я бы поставил доллары на пончики, это проблема на стороне сервера. В моем случае (и для моей жизни это не имеет никакого смысла, но это так), что ни одно из решений не показало, что эти методы приложения ожидают всех наворотов от веб-страницы, что означает «голова» "и" тело "и добавьте" HTML "для хорошей меры.
Тот факт, что ваш браузер будет отображать его правильно, не является гарантией того, что библиотеки API будут хорошо с этим справляться, поэтому я повторюсь ... укажите ваше приложение на веб-источник, который можно разумно ожидать отформатировать, а затем это оттуда.
Непредвиденная проблема конца потока вызвана, в основном, когда «Content-Length», упомянутый в ответе API, не соответствует реальному размеру API. Лучше обратиться к своему бэкэнд-разработчику, если он переопределяет длину контента.
Похожие вопросы
Связанные вопросы
Новые вопросы
android
Android - это мобильная операционная система Google, используемая для программирования или разработки цифровых устройств (смартфоны, планшеты, автомобили, телевизоры, одежда, стекло, IoT). Для тем, связанных с Android, используйте специальные теги Android, такие как android-intent, android-activity, android-адаптер и т. Д. Для вопросов, не связанных с разработкой или программированием, но связанных с платформой Android, используйте эту ссылку: https: // android.stackexchange.com .