PhoneGap 跨域 ajax 与 PhoneGap 开发者应用程序和 cli

Posted

技术标签:

【中文标题】PhoneGap 跨域 ajax 与 PhoneGap 开发者应用程序和 cli【英文标题】:PhoneGap cross domain ajax with PhoneGap developer app and cli 【发布时间】:2014-06-04 16:48:45 【问题描述】:

当使用 PhoneGap 开发者应用和 CLI 进行 ajax 跨域调用时,只有 GET 调用和 POST没有数据成功,带有数据的 POST 调用不起作用。如果尝试本地,一切正常。

我确实在 config.xml 中设置了 access origin="*"。 还在脚本中设置了$.support.cors = true;

这是我在 PhoneGap 的 Hello world 应用上做的例子。

    <script type="text/javascript">
    $(document).bind("ready", function() 
        $.support.cors = true;
        test();
    );
    </script>

    <script>
    function test()
        $.ajax(
            url:'http://www.url.com',
            type:'POST',
            headers:
                "Content-Type":'application/x-www-form-urlencoded'
            ,
            data:'x=1',
            cache:false,
            success: function (data) 
                alert(data);
            ,
            error:function(request, textStatus, errorThrown)
                alert(errorThrown);
            
        );
        return false;
    
    </script>

有趣的是,在查看控制台时,调用后,调用时并没有显示,而是在一段时间后显示。响应时间超长,响应时间超过15秒,最终得到响应时ajax没有错误。但是在控制台中,我收到错误,Proxy error: url: "entered url" ECONNRESET

我试过通过 REST 控制台做同样的请求,效果是一样的。

代理的网址是

http://localhost:3000/proxy/

我没有对代理进行任何更改,如果可能我想禁用它,但如果没有,只需启用跨域。

我正在进行跨域调用的网站已启用跨域调用,并且我在 Ripple 中测试了应用程序,一切正常。此外,如果我使用 PhoneGap 构建应用程序,一切都在 smarthphone (ios/iPhone) 上运行。

请注意,如果我正在使用 Ripple 测试应用程序,则只有远程代理有效且禁用代理,本地无效。这可能表明存在本地问题,但我是代理和 PhoneGap 的新手。

【问题讨论】:

我遇到了同样的问题。可惜还没有回应。如果我自己找到答案,我会在这里发布。 【参考方案1】:

我找到了解决方法,它不是使用 phonegap-cli 或 node.js,但我可以使用 phonegap 开发者应用程序进行测试,这是主要的事情,所以我不必每次都重新构建应用程序。

如果您的计算机上安装了 Apache,您可以告诉 phonegap 开发者应用程序监听标准端口 (80) 而不是 phonegap-cli :3000,它会成功加载应用程序。通常在使用 Apache(xampp 或 wampp)时,您使用的是 localhost,或者您可能创建了不起作用的 vhost,您必须找出您的本地网络 IP,通常是 192.168.1.X,其中 X 是您的号码电脑。这与启动 serve 时显示的相同 IP phonegap-cli 监听。

您可以通过 CMD->ipconfig 和 IPv4 地址在 Windows 上找到它。通过在浏览器地址栏中输入http://IP/ 进行测试,如果您安装了Apache,它将引导您到本地主机的根文件夹,与http://localhost/ 相同。就我而言,我使用的是 XAMPP (wampp),所以它是 xampp 文件夹中的 htdocs。

现在,您应该将您的应用项目也放在该文件夹中,以便您可以轻松访问它。如果您的项目在那里,您应该能够通过转到http://IP/project-folder/ 来访问它。所以你输入 phonegap 开发者应用程序的路径,它应该可以工作!

注意,如果您使用 phonegap 项目结构,您可能必须将www 添加到我之前提到的路径末尾,所以它看起来像http://IP/project-folder/www/。我没有使用 phonegap 标准文件夹结构,它对我有用。

另外,我没有使用太多的本地函数,所以我无法判断它是否 100% 工作。我的主要目标是让跨域调用正常工作,并且能够在不为任何更改重新构建应用程序的情况下对其进行测试。

另外,像 3/4 手指点击这样的快捷方式将不起作用,因为在这种情况下您没有使用 node.js,因此计算机没有对 phonegap 开发人员应用程序的反馈。

建议,在您进行更改时添加某处按钮以重新加载应用程序,这样您就不必每次更改时都退出应用程序。

【讨论】:

这解决了与我类似的问题。 (虽然我有一个 nginx 设置)。谢谢@mr-br【参考方案2】:

我知道这个帖子很老了(并且可能有很多重复。如果是这样,很抱歉)。

我通过在本地 Apache 设置上启用 CORS 解决了这个问题。有很多不同的方法可以做到这一点。我这样做的方法是将以下内容添加到我的虚拟主机配置中。

Header set Access-Control-Allow-Origin "*"

您应该也可以使用.htaccess 启用此功能。确保mod_headers 也已启用。默认情况下,它通常在 httpd.conf 中被注释掉。同样,有多种方法可以设置您的 Apache 环境,因此这可能不是适合您的解决方案。

另外;我确实在 jQuery 中启用了 cors 并将 crossDomain 添加到 ajax 方法数据中。不知道是否真的需要。

【讨论】:

这是另一种错误。已在新版 PhoneGap 中修复。【参考方案3】:

同意 Br 先生,我使用的是 Ripple/Chrome 模拟器,并且必须: - 禁用波纹代理/或设置为本地 - 在 jquery 中启用 cors,两次调用(参见文档 jqm) - 在 REST 服务上启用 cors

【讨论】:

以上是关于PhoneGap 跨域 ajax 与 PhoneGap 开发者应用程序和 cli的主要内容,如果未能解决你的问题,请参考以下文章

PhoneGap 跨域问题?

跨域不适用于 ios phonegap

Phonegap 3.0 iOS7 ApplicationPreferences 插件

iOS 版 PhoneGap 中的 websocket 状态如何?

AJAX POST To Jersey 启用 RESTful Web 服务跨域

Ajax 不能在 phonegap 上工作