我有一个应用程序,我用Javascript编写,用于Phonegap,它从我服务器上的PHP脚本中检索JSON编码的字符串。
当它是跨域请求时,是否可以从Javascript中的PHP中检索此JSON编码字符串?
我目前使用的是雅虎的YQL,它通过jQuery AJAX检索字符串,但我不想依赖雅虎的服务,特别是因为它在正常运行时间方面非常好看。
答案 0 :(得分:3)
对于跨域GET,如果您拥有端点,我建议您修改它以使用JSONP
由于浏览器<script>
标记可以从不同的域加载脚本,因此它是解决跨域问题的一种方法,而不用担心跨浏览器支持。它确实会产生一些潜在的跨站点脚本问题(我建议阅读上面链接的维基页面),你应该知道。
如果您使用jQuery
,使JSONP API调用变得非常简单,但通过自动动态注入<script>
标记,将src
属性设置为您的API端点,并创建一个调用成功后调用的回调函数。
修改服务器端点以获取callback
参数。用回调包装你的json响应。
e.g。 (不是真正的代码)
//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 :(得分: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>