Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1627207
  • 博文数量: 1481
  • 博客积分: 26784
  • 博客等级: 上将
  • 技术积分: 17045
  • 用 户 组: 普通用户
  • 注册时间: 2011-07-12 09:22
文章分类

全部博文(1481)

文章存档

2014年(10)

2013年(353)

2012年(700)

2011年(418)

分类: 系统运维

2012-06-11 11:36:30

JSONP实现Ajax跨域访问


JSONP = JSON with padding,但JSONPJSON不一样,它并不是一种数据格式。JSONP是一种JavaScript实现跨域cross-domain数据访问的方法。

基于same originpolicy,浏览器要求javascript/ajax只能够进行同域数据请求,该安全原因的限制使得使用开放API的数据不是非常方便。例如:Site1提供API:,输出内容为JSON格式的数据:
{"Name": "Min", "Id" : 1983,"Rank": 7}
site2.com/test.html使用javascript代码将无法获取site1提供的API的数据,因为是跨域的。
JSONP利用HTML


site1.com/api/user.php的代码稍微进行修改,结果如下:

$data = '{"Name":"Min", "Id" : 1983, "Rank": 7}';

if (isset($_REQUEST['cb'])) {
print $_REQUEST['cb']."(".$data.")"; //相当于输出了jsonpCallback({"Name": "Min", "Id" :1983, "Rank": 7});
} else {
print $data;
}
?>
这样当运行site2.com/test.html的时候,代码的结果变为:

然后调用本地定义的jsonpCallback函数,输出result.Name即为Min。最终实现跨域数据访问。
因此总结JSONP的基本原理即是:在本地定义一个callback,通过




function showPictures(pictures){
$.each(pictures.photos.photo,function(index, pic){
//{"id":"5953295109","owner":"36456011@N07","secret":"b847e26995", "server":"6023","farm":7, "title":"DSC02569","ispublic":1, "isfriend":0, "isfamily":0,"url_s":"http:\/\/farm7.static.flickr.com\/6023\/5953295109_b847e26995_m.jpg","height_s":"160", "width_s":"240"}
var path = pic.url_s;
if (pic.url_o != undefined) {
path = pic.url_o;
}
var img = "";
$('body').append(img);
});
}


使用jQuery.ajax提供的JSONP功能:
jQueryajax实现了JSONP方法,具体实现原理是:jQuery attaches a globalfunction to the window object that is called when the script is injected, thenthe function is removed on completion.,参看如下实例:






jsonp.php的代码如下:

echo $_GET['callback'] . "({'msg':'this is the remotemsg'});";
?>
当在$.ajax中设置dataType:"jsonp"的时候,jQuery会自动在url之后添加?callback=?,因此server端的API需要接受参数名为callback的值,且callback=?表示jQuery为该回调函数分配一个随机的唯一的名称。如果需要使用别的参数名而不是callback,可以设置jsonp选项;也可以使用jsonpCallback指定回调函数名。具体参看:
jQuery使用JSONP的简化方法:
相当于:
$.ajax({
url: url,
dataType: 'json',
data: data,
success: callback
});
$.getJSON规定如果url选项指定了诸如callback=?的字符串的话,会将其看作是JSONP方法,因此,简化使用如下:





原文地址:

阅读(432) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~