正文转自:http://www.cnblogs.com/dowinning/archive/2012/04/19/json-jsonp-jquery.html

 

前言:

 

说交AJAX就见面不可避免的面临两单问题,第一单凡是AJAX以何种格式来交换数据?第二只凡是跨域的需要如何化解?这点儿个问题即还发不同的缓解方案,比如数据足以据此自定义字符串或者用XML来讲述,跨域可以透过劳务器端代理来缓解。

但是至目前为止最让看重或者说首选的方案要用JSON来传数据,靠JSONP来跨域。而就便是本文将讲述的情节。

 

JSON和JSONP虽然仅发生一个假名之歧异,但实际上他们从来不是同一扭曲事:JSON是同一栽多少交换格式,而JSONP是一律种植据开发人员的才智创造有之一致种黑跨域数据交互协议。我们用最近较火的谍战片来打独比方,JSON是不法党们用来书写和交换情报的“暗号”,而JSONP则是将用暗号书写的新闻传递让好同志时采取的知晓方式。看到没有?一个凡是讲述信息之格式,一个凡信传送双方约定的法门。

 

既然无聊聊,那咱们就不再用机械的道来叙述,而是将关爱重心在帮开发人员理解是否应当选择以与如何使用及。

 

 什么是JSON?

 

面前简单说了一晃,JSON是如出一辙种植基于文本的数据交换方式,或者称数据描述格式,你是否该选用外首先定要关心她所负有的助益。

 

JSON的优点:

1、基于纯文本,跨平台传递极其简约;

2、Javascript原生支持,后台语言几乎全部支撑;

3、轻量级数据格式,占用字符数量最为少,特别符合互联网传递;

4、可读性较强,虽然小XML那么一目了然,但在情理之中之相继缩进之后还是特别容易辨别的;

5、容易编写和分析,当然前提是公只要解多少结构;

JSON的瑕疵当然也产生,但当作者看来实在是不值一提的东西,所以不再单独说明。

 

JSON的格式或让规则:

JSON能够以非常简单的艺术来叙述数据结构,XML能举行的它还能够召开,因此当跨平台方面彼此完全不分伯仲。

1、JSON只生少栽多少类描述符,大括号{}和方括号[],其余英文冒号:是映射符,英文逗号,是劈隔符,英文双引号””是定义符。

2、大括声泪俱下{}用来叙述一组“不同品类的无序键值对聚集”(每个键值对好解吧OOP的性描述),方括号[]因此来讲述一组“相同类别的雷打不动数据集合”(可对应OOP的数组)。

3、上述两栽集合中设有差不多单子项,则通过英文逗号,进行分隔。

4、键值对以英文冒号:进行分隔,并且建议键名都丰富英文双引号””,以便为不同语言的辨析。

5、JSON内部常因此数据类型无非就是是字符串、数字、布尔、日期、null
这么几个,字符串必须用对引号引起来,其余的都毫不,日期类型比较特殊,这里虽无进行叙述了,只是建议一旦客户端从未以日期排序功能需求的讲话,那么将日子时一直当字符串传递就哼,可以省很多劳动。

 

JSON实例:

图片 1😉

// 描述一个人

var person = {
    "Name": "Bob",
    "Age": 32,
    "Company": "IBM",
    "Engineer": true
}

// 获取这个人的信息

var personAge = person.Age;

// 描述几个人

var members = [
    {
        "Name": "Bob",
        "Age": 32,
        "Company": "IBM",
        "Engineer": true
    },
    {
        "Name": "John",
        "Age": 20,
        "Company": "Oracle",
        "Engineer": false
    },
    {
        "Name": "Henry",
        "Age": 45,
        "Company": "Microsoft",
        "Engineer": false
    }
]

// 读取其中John的公司名称

var johnsCompany = members[1].Company;

// 描述一次会议

var conference = {
    "Conference": "Future Marketing",
    "Date": "2012-6-1",
    "Address": "Beijing",
    "Members": 
    [
        {
            "Name": "Bob",
            "Age": 32,
            "Company": "IBM",
            "Engineer": true
        },
        {
            "Name": "John",
            "Age": 20,
            "Company": "Oracle",
            "Engineer": false
        },
        {
            "Name": "Henry",
            "Age": 45,
            "Company": "Microsoft",
            "Engineer": false
        }
    ]
}

// 读取参会者Henry是否工程师

var henryIsAnEngineer = conference.Members[2].Engineer;

图片 2😉

 

至于JSON,就说这样多,更多细节要在支付过程中查资料深入学。

 

 什么是JSONP?

 

先说说JSONP是怎么有的:

骨子里网上有关JSONP的讲课有广大,但可总首一律,而且云里雾里,对于广大正要接触的人头来讲理解起来有点不便,小而免才,试着用自己的法门来阐释一下此题材,看看是否来扶持。

1、一个家喻户晓的题材,Ajax直接呼吁普通文书是跨域无权力访问的问题,甭管您是静态页面、动态网页、web服务、WCF,只要是跨域请求,一律取缔;

2、不过我们而发现,Web页面上调用js文件时则未叫是否跨域的影响(不仅如此,我们还发现凡是有”src”这个特性之竹签都怀有跨域的能力,比如<script>、<img>、<iframe>);

3、于是可以看清,当前阶段要想通过纯web端(ActiveX控件、服务端代理、属于未来之HTML5之Websocket等艺术不到底)跨域访问数就是特发生相同种植可能,那即便是当远距离服务器上设法将数据弄虚作假进js格式的公文里,供客户端调用和更加处理;

4、恰巧我们就亮发生一致种植叫做JSON的纯字符数量格式可以简单之叙说复杂数据,更理想的凡JSON还受js原生支持,所以于客户端几乎可肆意的拍卖这种格式的数量;

5、这样子解决方案就是呼的需来了,web客户端通过与调用脚本一模一样的办法,来调用跨域服务器上动态变化的js格式文件(一般以JSON为后缀),显而易见,服务器之所以要动态生成JSON文件,目的就是在于把客户端需要之数码装入进去。

6、客户端在针对JSON文件调用成功后,也不怕拿走了协调所需要的数量,剩下的尽管是仍自己要求进行拍卖以及表现了,这种获取远程数据的方法看起很像AJAX,但实际上并无同等。

7、为了便利客户端采用数据,逐渐形成了千篇一律种非正式传输协议,人们管它们称作JSONP,该谋的一个中心就是允许用户传递一个callback参数为服务端,然后服务端返回数据时会将此callback参数作为函数叫来包裹已JSON数据,这样客户端就好随心所欲定制好之函数来机关处理回来数据了。

苟对callback参数如何运用还有几模糊的讲话,我们后面会产生具体的实例来教。

 

JSONP的客户端具体落实:

不管jQuery也好,extjs也罢,又要是其余支持jsonp的框架,他们默默所做的办事还是一样的,下面我来循序渐进的验证一下jsonp在客户端的贯彻:

 

1、我们明白,哪怕跨域js文件被的代码(当然指合web脚本安全策略的),web页面也是足以无偿履行的。

长距离服务器remoteserver.com根目录下发生只remote.js文件代码如下:

alert('我是远程文件');

地面服务器localserver.com下发出只jsonp.html页面代码如下:

图片 3😉

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <script type="text/javascript" src="http://remoteserver.com/remote.js"></script>
</head>
<body>

</body>
</html>

图片 4😉

毫无疑问,页面将见面弹有一个唤起窗体,显示跨域调用成功。

 

2、现在我们当jsonp.html页面定义一个函数,然后于远程remote.js中盛传数据进行调用。

jsonp.html页面代码如下:

图片 5😉

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <script type="text/javascript">
    var localHandler = function(data){
        alert('我是本地函数,可以被跨域的remote.js文件调用,远程js带来的数据是:' + data.result);
    };
    </script>
    <script type="text/javascript" src="http://remoteserver.com/remote.js"></script>
</head>
<body>

</body>
</html>

图片 6😉

remote.js文件代码如下:

localHandler({"result":"我是远程js带来的数据"});

运作之后查看结果,页面成功弹来提示窗口,显示本地函数被跨域的远程js调用成功,并且还接受到了远程js带来的多寡。很喜欢,跨域远程获取数据的目的基本实现了,但是同时一个题材应运而生了,我怎么给远道js知道其应该调用的地头函数叫什么名字啊?毕竟是jsonp的服务者都要面对广大服务目标,而这些劳务对象分别的地方函数都未均等啊?我们跟着朝下看。

 

3、聪明之开发者很容易想到,只要服务端提供的js脚本是动态变化的就算实施了呗,这样调用者可以招一个参数过去晓服务端“我思如果一如既往截调用XXX函数的js代码,请你回来给自己”,于是服务器就足以遵循客户端的要求来生成js脚本并应了。

看jsonp.html页面的代码:

图片 7😉

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <script type="text/javascript">
    // 得到航班信息查询结果后的回调函数
    var flightHandler = function(data){
        alert('你查询的航班结果是:票价 ' + data.price + ' 元,' + '余票 ' + data.tickets + ' 张。');
    };
    // 提供jsonp服务的url地址(不管是什么类型的地址,最终生成的返回值都是一段javascript代码)
    var url = "http://flightQuery.com/jsonp/flightResult.aspx?code=CA1998&callback=flightHandler";
    // 创建script标签,设置其属性
    var script = document.createElement('script');
    script.setAttribute('src', url);
    // 把script标签加入head,此时调用开始
    document.getElementsByTagName('head')[0].appendChild(script); 
    </script>
</head>
<body>

</body>
</html>

图片 8😉

这次的代码变化较坏,不再直接将远程js文件写很,而是编码实现动态查询,而立吗亏jsonp客户端实现的主导组成部分,本例中之要害也不怕在于怎样完成jsonp调用的备经过。

咱俩看看调用的url中传递了一个code参数,告诉服务器本身若查阅的凡CA1998糟糕航班的音讯,而callback参数则告知服务器,我的当地回调函数叫做flightHandler,所以恳请把询问结果传到这个函数中展开调用。

OK,服务器很明白,这个称呼flightResult.aspx的页面生成了一样截这样的代码提供给jsonp.html(服务端的兑现此虽无演示了,与公选用的言语无关,说到底就是是合接字符串):

flightHandler({
    "code": "CA1998",
    "price": 1780,
    "tickets": 5
});

俺们见到,传递让flightHandler函数的是一个json,它描述了航班的中心信息。运行一下页面,成功弹来提示窗口,jsonp的履行都经过顺利完成!

 

4、到这里了的言语,相信你就能够亮jsonp的客户端实现原理了吧?剩下的便是哪把代码封装一下,以便为同用户界面交互,从而实现多次跟重复调用。

嘿?你用底凡jQuery,想掌握jQuery如何实现jsonp调用?好吧,那我就是好人做到底,再吃你同样截jQuery使用jsonp的代码(我们还是沿用上面十分航班信息查询的事例,假定返回jsonp结果未变换):

图片 9😉

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" >
 <head>
     <title>Untitled Page</title>
      <script type="text/javascript" src=jquery.min.js"></script>
      <script type="text/javascript">
     jQuery(document).ready(function(){          $.ajax({
             type: "get",
             async: false,
             url: "http://flightQuery.com/jsonp/flightResult.aspx?code=CA1998",
             dataType: "jsonp",
             jsonp: "callback",//传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(一般默认为:callback)
             jsonpCallback:"flightHandler",//自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名,也可以写"?",jQuery会自动为你处理数据
             success: function(json){
                 alert('您查询到航班信息:票价: ' + json.price + ' 元,余票: ' + json.tickets + ' 张。');
             },
             error: function(){
                 alert('fail');
             }
         });
     });
     </script>
     </head>
  <body>
  </body>
 </html>

图片 10😉

大凡无是来硌奇怪?为什么自己这次没有写flightHandler这个函数呢?而且甚至为运行成功了!哈哈,这就是jQuery的功绩了,jquery在拍卖jsonp类型的ajax时(还是经不住吐槽,虽然jquery也将jsonp归入了ajax,但实在它确实不是同一转事),自动帮助你别回调函数并拿数据取出来供success属性方法来调用,是休是颇爽呀?

 

哼哪,写及此地,我既无力复写下去,又困顿又辛苦,得赶紧睡。朋友等而是看即毋庸置疑,觉得出启迪,给点单“推荐”呗!由于实在比较简单,所以即便不再供demo源码下载了。

 

 4月20日下午的补充:

 

没有悟出上了博客园的峰漫漫推荐。看到大家对立即首文章的肯定和评论,还是要命开心之,这里针对ajax与jsonp的异议再举行有续说明:

1、ajax和jsonp这点儿种植技术于调用方式上“看起”很像,目的呢一致,都是要一个url,然后将服务器返回的多寡进行拍卖,因此jquery和ext等框架都拿jsonp作为ajax的一样种植样式进行了包装;

2、但ajax和jsonp其实本质上是例外的物。ajax的主导是通过XmlHttpRequest获取非本页内容,而jsonp的核心则是动态添加<script>标签来调用服务器提供的js脚本。

3、所以说,其实ajax与jsonp的界别不在是否跨域,ajax通过服务端代理一样可以实现跨域,jsonp本身为非排外同域的多少的获得。

4、还有即使是,jsonp是同等栽办法还是说不强制性协议,如同ajax一样,它也未自然非要是因此json格式来传递数据,如果你肯,字符串都施行,只不过这样不便民用jsonp提供公开服务。

总而言之,jsonp不是ajax的一个特例,哪怕jquery等巨头将jsonp封装上了ajax,也无可知更改着同样点!

 

顾:此篇属博主原创,转载请注明作者信息及原始链接,谢谢合作。

相关文章

网站地图xml地图