Я столкнулся с проблемой, заключающейся в том, что мое приложение может получить доступ к 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?
Я застрял со вчерашнего дня ...
как я могу сделать это доступным?
это не 127.0.0.1 ..
сначала проверьте, доступен ли этот URL-адрес в веб-браузере эмулятора Android.
попробуйте получить доступ к вашему серверу из приложения веб-браузера в эмуляторе Android, сообщите нам, работает ли он
да .. работает .. что мне тогда делать?
тогда вам, вероятно, нужно проверить, есть ли у вашего приложения разрешение на ИНТЕРНЕТ. К сожалению, я не знаю, как проверить его на наличие реакции.
У меня есть это в моем AndroidManisfet.xml <uses-permission android:name = "android.permission.INTERNET" />
Вам необходимо двоеточие в URL-адресе после http - let url = 'http: //1**.***.***.***/bla/bla';
@GregHNZ да, я исправил ... все то же самое ... но я попытался получить другой API, используя https, он работает ... есть идеи, как включить запрос с помощью http?
Какая ошибка выдает? Опубликуйте сообщение об ошибке.
@RaviRaj код 403
Кстати, код ошибки 403 означает "запрещено". Разрешает ли ваш сервер доступ к URL-адресу из ОС Android ?. Проверьте, не допустили ли вы ошибок в заголовках, возможно, из-за жесткого кодирования. Я не думаю, что HTTP или HTTPS имеют какое-либо значение в Android.
Для запросов 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?
Я вызываю функцию внутри protected String getMainComponentName() {} .. это правильно?
http//1**.***.***.***- это IP-адрес. Убедитесь, что он доступен в эмуляторе Android. Интересно, это127.0.0.1