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

Я столкнулся с проблемой, заключающейся в том, что мое приложение может получить доступ к 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?
Я застрял со вчерашнего дня ...

http//1**.***.***.*** - это IP-адрес. Убедитесь, что он доступен в эмуляторе Android. Интересно, это 127.0.0.1
Vladyslav Matviienko 14.05.2018 06:24

как я могу сделать это доступным?

kurniawan26 14.05.2018 06:25

это не 127.0.0.1 ..

kurniawan26 14.05.2018 06:25

сначала проверьте, доступен ли этот URL-адрес в веб-браузере эмулятора Android.

Vladyslav Matviienko 14.05.2018 06:26

попробуйте получить доступ к вашему серверу из приложения веб-браузера в эмуляторе Android, сообщите нам, работает ли он

Fahed Yasin 14.05.2018 06:31

да .. работает .. что мне тогда делать?

kurniawan26 14.05.2018 06:31

тогда вам, вероятно, нужно проверить, есть ли у вашего приложения разрешение на ИНТЕРНЕТ. К сожалению, я не знаю, как проверить его на наличие реакции.

Vladyslav Matviienko 14.05.2018 06:43

У меня есть это в моем AndroidManisfet.xml <uses-permission android:name = "android.permission.INTERNET" />

kurniawan26 14.05.2018 06:46

Вам необходимо двоеточие в URL-адресе после http - let url = 'http: //1**.***.***.***/bla/bla';

GregHNZ 14.05.2018 06:57

@GregHNZ да, я исправил ... все то же самое ... но я попытался получить другой API, используя https, он работает ... есть идеи, как включить запрос с помощью http?

kurniawan26 14.05.2018 07:04

Какая ошибка выдает? Опубликуйте сообщение об ошибке.

Ravi Raj 14.05.2018 09:14

@RaviRaj код 403

kurniawan26 14.05.2018 09:17

Кстати, код ошибки 403 означает "запрещено". Разрешает ли ваш сервер доступ к URL-адресу из ОС Android ?. Проверьте, не допустили ли вы ошибок в заголовках, возможно, из-за жесткого кодирования. Я не думаю, что HTTP или HTTPS имеют какое-либо значение в Android.

Ravi Raj 14.05.2018 09:30
0
13
518
1

Ответы 1

Для запросов 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.

где мне поместить этот код? Внутри моего MainActivity?

kurniawan26 14.05.2018 08:29

Я вызываю функцию внутри protected String getMainComponentName() {} .. это правильно?

kurniawan26 14.05.2018 09:15

Другие вопросы по теме