为什么我 'fetch' 无法从我在 Android 上的 Capacitor 应用中访问某些网址?

Why can't I 'fetch' some URLs from my Capacitor app on Android?

我正在尝试通过使用 PouchDB 的 Capacitor 编写移动应用程序。当我通过 Android Studio 运行 模拟器中的应用程序时,与远程 CouchDB 实例的连接失败。当 运行 在 Android.

上时,我已经将此归结为某些 URL 在 fetch API 中的失败

为了调试,我制作了一个最小的 Web 应用程序并使用 Capacitor 将其包装到 运行 on Android。该应用程序包含以下代码

const testFetch = (url) => {
    console.log("Testing fetch", url)
    fetch(url)
        .then((response) => response.text())
        .then((t) => {
            console.log("Respose from fetch:", url)
            console.log(t)
            console.log("that was it")
        })
        .catch((reason) => {
            console.log("FETCH FAILED", url, reason)
        })
}

然后我有三个测试:

  testFetch("https://jsonplaceholder.typicode.com/todos/1");   // just some JSON 
  testFetch("http://10.0.2.2:5984/simple");    // local pouchdb instance 
  testFetch("http://10.0.2.2:8080/sample.json");  // local http server + CORS 

后两个在Android模拟器中运行ning时使用作为开发机别名的IP地址。我确认我可以从模拟器上的浏览器访问所有这些 URL,但应用程序在第一次成功而在后两次失败(错误:TypeError: Failed to fetch)。 运行在浏览器中连接基本网络应用程序时,全部成功(使用 localhost 而不是 10.0.2.2)。

CORS headers 在所有 URL 上都已到位。据我所知,该应用程序甚至没有尝试访问失败的两个服务器——例如没有 HEAD 请求。我还尝试了各种其他 URL,但看不到失败的模式——例如。这不是端口号 != 80.

任何关于正在发生的事情的线索都将不胜感激。

所以我没有注意到失败的 URLs 的共同点是 http 而不是 https。事实证明,fetch 静默地无法为任何 http URL 工作,只是给出错误 'Failed to fetch'.

我不确定这是 Android 网络视图的功能还是 Capacitor 本身的功能。电容器文档建议 using https is a good idea 而不是 http 将不起作用。

在主页中设置内容安全策略不会改变此策略 header。

最初的目标是将本地 PouchDB 数据库连接到远程 CouchDB 实例。只要通过 https 提供 CouchDB 实例,这现在就可以工作。如果没有它,您只会无声地同步失败。