无论我做什么,PhoneGap 都不想使用 REST 服务
PhoneGap doesn't want to use REST service no matter what I do
我有一个正在使用 AngularJS 的 PhoneGap 应用程序。我正在对我的节点后端使用一个非常简单的 $http 调用:
$http.get("http://localhost:6969/random")
.then(function(response) {
$scope.images = response.data;
});
无论如何,PhoneGap 永远不会打到后端。我已经在普通浏览器中测试过它,它按预期工作。
我显然已经阅读了很多关于它的内容并且大多数人使用白名单修复它,但在我的 config.xml
中,我的白名单几乎是开放的:
<plugin name="cordova-plugin-whitelist" source="npm" spec="1.1.0" />
<allow-navigation href="*" subdomains="true" />
<allow-intent href="*" subdomains="true"/>
<access origin="*" subdomains="true"/> <!-- Required for iOS9 -->
我需要更改什么?断断续续地研究了这个错误几天,无法在我的空闲时间真正创建新的很酷的功能有点烦人。
编辑:我正在使用 phonegap serve
为应用程序提供服务并使用 PhoneGap Developer App 对其进行测试。
我建议您的内容安全策略可能需要修改以包含一个 connect-src 子句来指定 Ajax 请求可以到达的位置。
使用您在评论中发布的 CSP 元标记:
<meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src: 'self' 'unsafe-inline' 'unsafe-eval'" />
我建议对此进行修改,以向任何地方开放 Ajax 请求,看看是否有帮助,然后将其控制在您想要支持的域中。
建议的 CSP 为:
<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *; connect-src *">
如果这样可行,并且您想以后只锁定一个域,您会想要这样的东西:
<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *; connect-src http://api.mydomain.com">
此外,我认为您需要更改您的应用程序代码以通过主机名或 IP 地址连接到您的服务器,这样在设备上它就不会与设备本身混淆 'localhost' 并尝试连接到设备上的端口 6969。
所以:
$http.get("http://localhost:6969/random")
可能需要变成:
$http.get("http://myhost.mydomain.com:6969/random")
或
$http.get("http://xxx.xxx.xxx.xxx:6969/random")
网上有一些资源:
我有一个正在使用 AngularJS 的 PhoneGap 应用程序。我正在对我的节点后端使用一个非常简单的 $http 调用:
$http.get("http://localhost:6969/random")
.then(function(response) {
$scope.images = response.data;
});
无论如何,PhoneGap 永远不会打到后端。我已经在普通浏览器中测试过它,它按预期工作。
我显然已经阅读了很多关于它的内容并且大多数人使用白名单修复它,但在我的 config.xml
中,我的白名单几乎是开放的:
<plugin name="cordova-plugin-whitelist" source="npm" spec="1.1.0" />
<allow-navigation href="*" subdomains="true" />
<allow-intent href="*" subdomains="true"/>
<access origin="*" subdomains="true"/> <!-- Required for iOS9 -->
我需要更改什么?断断续续地研究了这个错误几天,无法在我的空闲时间真正创建新的很酷的功能有点烦人。
编辑:我正在使用 phonegap serve
为应用程序提供服务并使用 PhoneGap Developer App 对其进行测试。
我建议您的内容安全策略可能需要修改以包含一个 connect-src 子句来指定 Ajax 请求可以到达的位置。
使用您在评论中发布的 CSP 元标记:
<meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src: 'self' 'unsafe-inline' 'unsafe-eval'" />
我建议对此进行修改,以向任何地方开放 Ajax 请求,看看是否有帮助,然后将其控制在您想要支持的域中。
建议的 CSP 为:
<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *; connect-src *">
如果这样可行,并且您想以后只锁定一个域,您会想要这样的东西:
<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *; connect-src http://api.mydomain.com">
此外,我认为您需要更改您的应用程序代码以通过主机名或 IP 地址连接到您的服务器,这样在设备上它就不会与设备本身混淆 'localhost' 并尝试连接到设备上的端口 6969。
所以:
$http.get("http://localhost:6969/random")
可能需要变成:
$http.get("http://myhost.mydomain.com:6969/random")
或
$http.get("http://xxx.xxx.xxx.xxx:6969/random")
网上有一些资源: