cordova run android => TypeError: Не удалось получить - PullRequest
0 голосов
/ 21 октября 2019

Мое приложение 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
...