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 3.0 iOS7 ApplicationPreferences 插件
iOS 版 PhoneGap 中的 websocket 状态如何?