2

我有一个用 Javascript 编写的用于 Phonegap 的应用程序,它从我服务器上的 PHP 脚本中检索 JSON 编码的字符串。

当它是一个跨域请求时,是否可以从 Javascript 中的 PHP 中检索这个 JSON 编码的字符串?

我目前使用的是 Yahoo 的 YQL,它通过 jQuery AJAX 检索字符串,但我不想依赖 Yahoo 的服务,特别是因为它在正常运行时间方面今天非常不稳定。

4

2 回答 2

3

对于跨域 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'
于 2012-11-04T23:52:42.860 回答
0

有一个名为 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>
于 2012-11-04T23:46:35.717 回答