首页 > 解决方案 > 为什么 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
我从昨天开始就卡住了...

标签: androidapihttpreact-nativehttps

解决方案


对于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班级或您的 main中调用此函数Activity


推荐阅读