Ошибка HTTP: java.net.SocketTimeoutException: время ожидания на новом Android Gradle - PullRequest
0 голосов
/ 14 ноября 2018

Я использую

 classpath 'com.android.tools.build:gradle:3.2.1'

 distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip

, и каждый раз, когда я пытаюсь подключиться к своему API сервера, время ожидания истекает.

СБОЙ HTTP: java.net.SocketTimeoutException

Мой серверный API прекрасно работает, и я проверил его с помощью Postman & Direct URL.Единственный способ исправить это - перейти на плагин Gradle 3.0.4 или подключить Android-устройство к VPN.Я из Ирана, я сомневаюсь, что в случае каких-либо проблем с доступом к моим серверам из моей страны.Я даже пытался установить длительные таймауты для моего HTTPClient, но я все еще получаю ту же ошибку на каждом API.Однако после 20-30 повторных попыток я наконец могу получить только 1 успешный ответ.

Я использую Retrofit2.

Я также попытался установить это в своем манифесте, но ничего не изменилось

android:usesCleartextTraffic="true"

Кто-нибудь еще борется с этой проблемой?У кого-нибудь есть решение?

1 Ответ

0 голосов
/ 22 ноября 2018

Я нашел проблему!Это была проблема с самоподписанными серверами SSL.Вот исправление: вы должны создать класс UnsafeClient, а затем установить его для клиента дооснащения.

public class UnsafeOkHttpClient {  
public static OkHttpClient getUnsafeOkHttpClient() {
    try {
        // Create a trust manager that does not validate certificate chains
        final TrustManager[] trustAllCerts = new TrustManager[] {
                new X509TrustManager() {
                    @Override
                    public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
                    }

                    @Override
                    public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
                    }

                    @Override
                    public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                        return new java.security.cert.X509Certificate[]{};
                    }
                }
        };

        // Install the all-trusting trust manager
        final SSLContext sslContext = SSLContext.getInstance("SSL");
        sslContext.init(null, trustAllCerts, new java.security.SecureRandom());

        // Create an ssl socket factory with our all-trusting manager
        final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

        OkHttpClient.Builder builder = new OkHttpClient.Builder();
        builder.sslSocketFactory(sslSocketFactory, (X509TrustManager)trustAllCerts[0]);
        builder.hostnameVerifier(new HostnameVerifier() {
            @Override
            public boolean verify(String hostname, SSLSession session) {
                return true;
            }
        });

        OkHttpClient okHttpClient = builder.build();
        return okHttpClient;
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
  }
}

OkHttpClient okHttpClient = UnsafeOkHttpClient.getUnsafeOkHttpClient();

Retrofit.Builder builder = new Retrofit.Builder()  
    .baseUrl("BASEURL")
    .client(okHttpClient);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...