Почему эмулятор Android не может получить доступ к API с онлайн-сервера? - PullRequest
0 голосов
/ 14 мая 2018

Я столкнулся с проблемой, которая заключается в том, что мое приложение может обращаться к API из iOS simulator, но не из Android emulator.
Я называю API следующим образом:

async fetchData() {    
    let url = `http://1**.***.***.***/bla/bla`;

    try{
        let response = await fetch(url,{
            headers: {
                'x-application-id':'123',
                'hashing': this.hashGenerator("message"),
                'content-type': 'application/json'
            },
            method: "POST",
            body: JSON.stringify({
                "location":"city"
            })
        });
        if(!response.ok){
            throw new Error(response.status)
        } else {
            return await response.json();
        }
    } catch(error) {
        this.setState({ loadingList: false });
    }
}


Это потому, что я использую http вместо https?
Я застрял со вчерашнего дня ...

1 Ответ

0 голосов
/ 14 мая 2018

Для запросов http требуется подписание сертификата. Вы можете использовать следующий код, чтобы доверять всем сертификатам для вашего приложения. Поскольку ваше приложение использует только ваш сервер, при использовании этого кода не должно быть проблем с безопасностью.

public void trustAllCertificates() {
    try {
        TrustManager[] trustAllCerts = new TrustManager[]{
            new X509TrustManager() {
                public X509Certificate[] getAcceptedIssuers() {
                    X509Certificate[] myTrustedAnchors = new X509Certificate[0];
                    return myTrustedAnchors;
                }

                @Override
                public void checkClientTrusted(X509Certificate[] certs, String authType) {
                }

                @Override
                public void checkServerTrusted(X509Certificate[] certs, String authType) {
                }
            }
        };

    SSLContext sc = SSLContext.getInstance("SSL");
    sc.init(null, trustAllCerts, new SecureRandom());
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
    HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
        @Override
        public boolean verify(String arg0, SSLSession arg1) {
            return true;
        }
    });
    } catch (Exception e) {
    }
}

Просто вызовите эту функцию в вашем Application классе или в вашем основном Activity.

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