Мое приложение cordova запускает следующий JS. URL и код упрощены для этого вопроса.
let url = 'https://server.com/api/call';
fetch(url)
.then(r => r.json())
.then(d => alert('response ok: '+JSON.stringify(d)))
.catch(e => alert(e));
cordova run browser
alerts "response ok", что является ожидаемым результатом.
cordova run android
alerts TypeError: Failed to fetch
. Это происходит с эмулятором из Android SDK и с .apk, загруженным на мой андроид, который имеет активное подключение к Интернету. Android может достигать https://server.com/api/call через браузер, но не через мое приложение.
Ручной вызов https://server.com/api/call
через браузер возвращает ожидаемый JSON-ответ. Поэтому мы знаем, что серверная часть работает, и это допустимый вызов.
Соответствующий вызов API возвращает следующие заголовки ответа:
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: Origin, Content-Type, Accept
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Origin: *
config.xml
для приложения включает <access origin="https://server.com"/>
index.html
для приложения включает в себя:
<meta http-equiv="Content-Security-Policy" content="
default-src 'self' gap: cdvfile: https://ssl.gstatic.com;
connect-src https://server.com/;
img-src 'self' cdvfile: filesystem: https://server.com/img/ https://i.ytimg.com/vi/;
frame-src https://www.youtube.com/;
">
У меня есть доступ к передней и задней части. На сервере имеется действующий сертификат Standard CA CA 2. Я прочитал различные исправления, связанные с CORS или CSP, на случай, если это проблема. Что еще мне нужно сделать, чтобы получить ожидаемый ответ от андроида?
Больше вещей, которые я пробовал, которые не нужны для cordova run browser
, чтобы работать какожидается:
Добавлены разрешения для AndroidMainfest.xml
<uses-permission android:name="android.permission.INTERNET" />
Подкачаны fetch()
для XMLHttpRequest()
:
let request = new XMLHttpRequest();
request.open("GET", url, true);
request.onreadystatechange = function() {
if (request.readyState == 4) {
if (request.status == 200 || request.status == 0) {
alert(request.status + ': ' + request.responseText);
}
}
}
request.send();
В этом случае status
возвращает0
и responseText
возвращает пустую строку. Согласно https://stackoverflow.com/a/14507670/2578125, это в основном неопределенная ошибка, наиболее вероятная причина которой связана с CORS.
Проверены следующие журналы на сервере на случай, если есть подсказки об отклоненном / неудачном / недействительном ответе,Никакой радости.
- / var / log / apache / access.log
- / var / log / apache / error.log
- / var / log / www/www-error.log