为什么Android模拟器无法从在线服务器访问API?

时间:2018-05-14 04:21:45

标签: android api http react-native https

我遇到的问题是我的应用可以从iOS simulator访问API,但它不在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 :(得分:0)

对于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中调用此功能。