前言

说交AJAX就会不可避免的面临两个问题,第一单凡是AJAX以何种格式来交换数据?第二只是跨域的急需如何解决?这有限独问题时且产生差之化解方案,比如数据可以用从定义字符串或者用XML来叙述,跨域可以经过服务器端代理来化解。
可到目前为止最被尊重或者说首选之方案或用JSON来传数,靠JSONP来跨域。而立就是本文将讲述的内容。
JSON和JSONP虽然光出一个字母的距离,但实际她们从未是均等扭转事情:JSON是相同种植多少交换格式,而JSONP是同栽据开发人员的才智创造有底同一种植非法跨域数据交互协议。我们以最近可比火之谍战片来起个如,JSON是非法党们用来修和置换情报之“暗号”,而JSONP则是把用暗号书写的讯息传递给协调同志经常采用的喻方式。看到没有?一个是描述信息之格式,一个凡是信息传递双方约定的不二法门。
既无聊聊,那咱们尽管不再动用机械的法子来讲述,而是将关心重点放在帮开发人员理解是否当选择下及哪利用及。

什么是JSON

JSON的优点

  1. 基于纯文本,跨平台传递极其简约;
  2. Javascript原生支持,后台语言几乎一切支持;
  3. 轻量级数据格式,占用字符数量极其少,特别符合互联网传递;
  4. 可读性较强,虽然没有XML那么一目了然,但当情理之中的依次缩进之后还是蛮易辨认的;
  5. 容易编写和分析,当然前提是公如解多少结构;

JSON的格式或给规则

JSON能够为非常简单的法门来描述数据结构,XML能举行的它还能够举行,因此于跨平台方面彼此完全不分伯仲。

  1. JSON只出少数种植多少列描述符,大括如泣如诉{}和方括号[],其余英文冒号:是映射符,英文逗号,是分开隔符,英文双引号””是定义符。
  2. 大括哀号{}用来叙述一组“不同门类的无序键值对聚集”(每个键值对足领略啊OOP的性质描述),方括号[]因而来描述一组“相同类别的有序数据集合”(可针对应OOP的数组)。
  3. 上述两栽集合中设发生多独子项,则经过英文逗号,进行分隔。
  4. 键值对因英文冒号:进行分隔,并且建议键名都助长英文双引号””,以便为不同语言的分析。
  5. JSON内部常因此数据类型无非就是是字符串、数字、布尔、日期、null
    这么几只,字符串必须用双引号引起来,其余的都毫无,日期类型比较奇特,这里虽不进行叙述了,只是建议一旦客户端从未按照日期排序功能需求的言辞,那么把日子时一直当字符串传递就哼,可以节省很多烦劳。

JSON实例

// 描述一个人

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;

什么是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在客户端的兑现:

咱清楚,哪怕跨域js文件中之代码(当然指称web脚本安全策略的),web页面也是可无条件履行之。

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

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

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

<!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>

一定,页面将见面弹有一个提醒窗体,显示跨域调用成功。

参考https://www.cnblogs.com/dowinning/archive/2012/04/19/json-jsonp-jquery.html

相关文章

网站地图xml地图