为什么我无法从 Android 上的电容器应用中"获取"某些网址?



我正试图通过电容器编写一个使用PouchDB的移动应用程序。当我通过Android Studio在模拟器中运行应用程序时,与远程CouchDB实例的连接失败。我已经追踪到,在Android上运行时,某些URL的fetchAPI出现故障。

为了调试,我制作了一个最小的web应用程序,并使用Capacitor将其封装在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 

第二个使用的IP地址是在Android模拟器中运行时开发机器的别名。我确认我可以从模拟器上的浏览器访问所有这些URL,但应用程序在第一个URL上成功,在第二个URL上失败(错误:TypeError: Failed to fetch(。当在浏览器中运行基本web应用程序时,所有操作都成功(使用localhost而不是10.0.2.2(。

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

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

所以我没有注意到失败的URL的共同点是http而不是https。事实证明,fetch对任何http URL都无法正常工作,只会出现错误"Failed to fetch"。

我不确定这是安卓网络视图的功能还是电容器本身的功能。Capacitor文档建议使用https是个好主意,但并不是说http不起作用。

此策略不会通过在主页头中设置内容安全策略来更改。

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

最新更新