android - 为什么 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
请求,需要证书签名。您可以使用以下代码来信任您的应用程序的所有证书。由于您的应用程序仅使用您的服务器,因此使用此代码不应该有任何安全问题。
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
。
推荐阅读
- node.js - 带有 .env 变量的 typeorm 配置
- spring-boot - 错误:无法验证图像标签:无法解析参考:docker.io/library/projectName:0.0.1-SNAPSHOT
- machine-learning - 如何使用模型的预训练权重在下一次迭代中初始化权重?
- python - 用 Pandas 计算 lambda 的问题
- android - Android Recyclerview Java.lang.NullPointerException 打开软键盘时出现异常
- javascript - React Js map 函数给出“不是函数”错误
- python - 如何覆盖 Django AuthenticationForm 非活动消息
- javascript - 如何以角度更新echarts
- sql - 如何在 Oracle SQL 中查找和过滤同一张表上的数据
- python - 如何在python中将两个浮点数的差作为整数输出