跨域getJson遇到的问题

本文介绍了如何使用jQuery的getJSON和ajax方法解决跨域问题,并详细解释了JSONP的工作原理及注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在项目中遇到的这个问题.跨域要注意的两点:(1)必须是get方式;(2)必须是json格式.

跨域直接用的jquery的getJson,那么后台返回的数据必须是json格式,同时,在url添加callback参数:

例:

$.getJSON('http://www.baidu.com?jsonpCallback=?',function(data){

});


用$.ajax()例子:

$.ajax({

url:'http://ext.event.guagua.cn/1/webDanceFighting/getPrizeList',
type:"get",
dataType:"jsonp", 
jsonp:"jsonpCallback", 

success: function(data){

}
});


用google浏览器调试发现改接口:





服务器返回数据:

jQuery17207754015033133328_1393899140726({"Name":"loogn","Age":23})

返回的字符串就是一个调用一个叫“jQuery17207754015033133328_1393899140726” 的函数,参数是{"Name":"loogn","Age":23}。

其实这个很长的函数名是请求路径中callback=?的作用,我想应该是这样的:$.getJSON方法生成一个对回调方法的引用的名字,换掉?。上面请求会变成

http://localhost:2589/a.ashx?callback= jQuery17207754015033133328_1393899140726&_=1393899141057,所以服务器回返json时要处理一下,如:

 

     string cb = context.Request[ " callback "];
    context.Response.Write(cb +  " ( " + json +  " ) ");

 

参数名callback也可换成jsoncallback,我想是怕冲突吧,jsoncallback应该优先检测,没有再检测callback(没测试!!)

?也可是具体的函数名,这样回调函数就不能是匿名的了,用?生成只是jQuery为我们的一般操作提供的一个便利。



API中介绍:

dataType:"jsonp", //"jsonp": JSONP 格式。使用 JSONP 形式调用函数时,如 "myurl?callback=?" jQuery 将自动替换 ? 为正确的函数名,以执行回调函数。
jsonp:"jsonpCallback", //
在一个jsonp请求中重写回调函数的名字。这个值用来替代在"callback=?"这种GET或POST请求中URL参数里的"callback"部分,比如{jsonp:'onJsonPLoad'}会导致将"onJsonPLoad=?"传给服务器。



但是按照上面方法而且后台返回是json数据的前提下,浏览器仍然报错:


什么原因呢???

具体参照:http://bbs.youkuaiyun.com/topics/390416751

总之:一般写法

<?php
header("content-type:text/json;charset=utf-8");
header("Cache-Control: no-cache, must-revalidate");
$username='{"name":"老邹","age":1984}'; 
echo $username;
?>

但是:jsonp需要一个调用来触发你传入getjson的那个函数,而触发就靠你传入的一个callback参数,这个参数值实际上就是一个特殊函数名,你返回的必须是一段JS代码,才能够触发它,也就是类似
callack_12324343({'hello':'world'});
因此你上面的echo $username;改成

echo "{$_GET['callback']}({$username});";

才算符合jsonp的要求...



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值