我有一个用 Javascript 编写的用于 Phonegap 的应用程序,它从我服务器上的 PHP 脚本中检索 JSON 编码的字符串。
当它是一个跨域请求时,是否可以从 Javascript 中的 PHP 中检索这个 JSON 编码的字符串?
我目前使用的是 Yahoo 的 YQL,它通过 jQuery AJAX 检索字符串,但我不想依赖 Yahoo 的服务,特别是因为它在正常运行时间方面今天非常不稳定。
我有一个用 Javascript 编写的用于 Phonegap 的应用程序,它从我服务器上的 PHP 脚本中检索 JSON 编码的字符串。
当它是一个跨域请求时,是否可以从 Javascript 中的 PHP 中检索这个 JSON 编码的字符串?
我目前使用的是 Yahoo 的 YQL,它通过 jQuery AJAX 检索字符串,但我不想依赖 Yahoo 的服务,特别是因为它在正常运行时间方面今天非常不稳定。
对于跨域 GET,如果您拥有端点,我建议将其修改为使用JSONP
因为浏览器<script>
标签可以从不同的域加载脚本,这是解决跨域问题的一种方法,无需担心跨浏览器支持。它确实带来了一些您应该注意的潜在跨站点脚本问题(我建议阅读我上面链接的 wiki 页面)。
如果使用 JSONP API 调用非常容易jQuery
,但是通过<script>
自己动态注入标签、将src
属性设置为 API 端点并创建自己的回调函数,调用成功后调用的回调函数仍然很简单.
修改您的服务器端点以采用callback
参数。用回调包装你的 json 响应。
例如(不是真正的代码)
//example api url
//http://tempuri/apiendpoint?callback=foo
//example url handler (not in PHP)
app.get('/apiendpoint',function() {
return query.callback + '({"json": "value"});'
});
如果您不想支持 JSONP,可以启用跨域资源共享 (CORS)。iOS 和 Android 网络浏览器都支持它。为了添加对 CORS 的支持,您需要修改端点以发送适当的标头:
'Access-Control-Allow-Origin'
'Access-Control-Allow-Methods'
'Access-Control-Allow-Headers'
有一个名为 ACD(AJAX 跨域)的 Perl 脚本,我过去使用它非常成功 - 在这里查看。最好的部分是您不必依赖外部服务。
它是这样工作的:
<script type="text/javascript" src="http://my-domain.com/cgi-bin/ACD/ACD.js?uri=(http://www.google.com)"></script>
<script type="text/javascript">
alert(ACD.responseText); //Should alert the source of google.com
</script>