来自 jQuery.ajax PhoneGap Desktop 请求的 403 禁止响应

403 Forbidden response from jQuery.ajax request with PhoneGap Desktop

我设置了一个 PhoneGap 项目并通过 PhoneGap Desktop 启动它。 在这个项目中,我调用了以下 jQuery 方法:

$.ajax({
        type: 'GET',
        url: 'http://api.fixer.io/latest',
        dataType: 'json',
        success: function(data){
            exchangeRates = data;
            displayData(exchangeRates);
        }
    })

一旦我使用按钮触发它,我就会收到 403 "Forbidden" 响应。 请求的URL是:http://192.168.178.40:3000/proxy/http://api.fixer.io/latest

这是PhoneGap Desktop加载应用程序和代理的本地服务器地址(192.168.178.40:3000),这似乎也来自PhoneGap。 发送的请求 header 如下所示:

Host: 192.168.178.40:3000
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:42.0) Gecko/20100101 Firefox/42.0
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://192.168.178.40:3000/
Cookie: connect.sid=s%3AhoA3oe0JbAdmGQ4Z6bYlRuFa.oDM1qjeHCadzwfSmYy%2BFabG0b22OH0ZqRgVuLMlcCL8
Connection: keep-alive

响应 header 如下:

Connection: close
Content-Type: text/plain
Date: Fri, 20 Nov 2015 12:07:23 GMT
Server: nginx/1.4.6 (Ubuntu)
Status: 403 Forbidden
Transfer-Encoding: chunked

当我尝试打开请求的 URL 时,它提供了我想要的 JSON。

为什么我会收到 403?有人可以帮忙吗?

[成功后编辑]
好吧,好像我在我设置的 PhoneGap 项目中遇到了问题,因为 Simon Pricketts 建议似乎是正确的。
所以我建立了一个全新的项目。这次是没有 PhoneGap 覆盖的纯 Cordova 5.4.0 项目。然后我再次尝试了 Simons 的建议,瞧 ---> 这次成功了!

结论:PhoneGap 项目的 config.xml 与 Content-Security-Policy 相结合导致应用程序出现故障,从而导致 403 错误。由于我对 PhoneGap 不太熟悉,所以我直接尝试了 Cordova,效果很好。

您很可能没有 whitelisted the domain you're trying to access. As explained in this question,在连接到 "external" 域之前,您需要将其列入白名单。

为了让我们在这里也得到答案:您需要将其添加到您的配置文件中:

<access origin="*" />

如果使用 Cordova 5,您可能需要设置内容安全策略元标记,如果使用 iOS9 或将来将应用移至 iOS,则需要额外配置应用传输安全.

我有一个博客 post 演示了如何执行此操作,并且实际上还使用了您尝试使用的相同数据源 - 您可以阅读此 here

如果这是您的问题,您的 index.html 中需要这样的内容:

<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.fixer.io">

注意:connect-src 子句指定访问 http://api.fixer.io

在 Post Cordova 5 中,我相信您需要将白名单作为插件包含在 config.xml 文件中,如下所示:

<access origin="http://*.phonegap.com" subdomains="true" />
<access origin="*://*.api.fixer.io/*" subdomains="true" />

<plugin name="cordova-plugin-whitelist" />

如果您想从外部源或 ajax 调用中将外部文件包含到 window 中,您需要以这种方式包含插件