2012-11-04 77 views
2

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

当它是一个跨域请求时,是否有可能从JavaScript中的PHP中检索此JSON编码的字符串?

我目前使用的是雅虎的YQL,它通过jQuery AJAX检索字符串,但我不想依靠雅虎的服务,尤其是因为它在正常运行时间方面非常糟糕。

+0

是一个GET请求,“从我的服务器上的PHP脚本JSON编码字符串”加载你的?即你不能只使用jsonp吗? – AD7six

+0

你确定phonegap是否为跨域调用强制执行同源策略?我的理解是,他们没有,因为应用程序是通过“localhost – Alan

回答

3

跨域GET的,如果你自己的终点,我建议修改为使用JSONP

因为浏览器<script>标签可以从不同的域加载脚本,它是解决跨域问题的一种方式,几乎不用担心跨浏览器支持。它确实会造成一些潜在的跨站脚本问题(我推荐阅读上面链接的wiki页面),您应该知道这些问题。

让JSONP API调用是超级容易,如果你使用jQuery,但它自己动态注射<script>标签,该src属性设置为你的API端点,并创建自己的回调函数仍然足够简单以严格的JavaScript来做到这一点调用成功后调用。

修改您的服务器端点以采用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' 
+1

这真的是最简单的解决方案。让这个工作,按照这个指南(它帮助了我)http://www.fbloggs.com/2010/07/09/how-to-access-cross-domain-data-with-ajax-using-jsonp-jquery - 和 - PHP / – Charlie

0

有一个名为ACD(AJAX Cross Domain)的Perl脚本,我过去使用得相当成功 - 请查看here。最好的部分是你不必依靠外部服务。

它的工作原理是这样的:

<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> 
+0

运行的Perl脚本运行在服务器端还是客户端,尽管? – Charlie

+0

@Charlie服务器端 –