与你分享JSON与JSONP的“故事”

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。易于人阅读和编写,同时也易于机器解析和生成。它基于JavaScript(Standard ECMA-262 3rd Edition – December 1999)的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。

JSON建构于两种结构: 

1. “名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),记录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。   

2. 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。  
这些都是常见的数据结构。事实上大部分现代计算机语言都以某种形式支持它们。这使得一种数据格式在同样基于这些结构的编程语言之间交换成为可能。JSON具有以下这些形式: 对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。 数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。

[例一]

Date.prototype.getCurrentDate=function(){
var mydate=new Date();
return mydate.getFullYear()+"年"+mydate.getMonth()+"月"+mydate.getDay()+"日";
};
//JSON第一种结构方式
var myjson={"name":"FeiHu","today":function(){return new Date().getCurrentDate();}};
alert("报告:"+myjson.name+",今天是:"+ myjson.today());

[例二]

//JSON第二种结构方式,结合第一种结构
var myjson2=["苹果","橘子","香蕉","草莓",{"a":"北京","b":"上海","c":"石家庄"}];
alert(myjson2[4].a);

JSONP背景

Asynchronous JavaScript and XML (Ajax) 是驱动新一代 Web 站点(流行术语为 Web 2.0 站点)的关键技术。Ajax 允许在不干扰 Web 应用程序的显示和行为的情况下在后台进行数据检索。使用 XMLHttpRequest 函数获取数据,它是一种 API,允许客户端 JavaScript 通过 HTTP 连接到远程服务器。Ajax 也是许多 mashup 的驱动力,它可将来自多个地方的内容集成为单一 Web 应用程序。

不过,由于受到浏览器的限制,该方法不允许跨域通信。如果尝试从不同的域请求数据,会出现安全错误。如果能控制数据驻留的远程服务器并且每个请求都前往同一域,就可以避免这些安全错误。但是,如果仅停留在自己的服务器上,Web 应用程序还有什么用处呢?如果需要从多个第三方服务器收集数据时,又该怎么办?

理解同源策略限制

同源策略阻止从一个域上加载的脚本获取或操作另一个域上的文档属性。也就是说,受到请求的 URL 的域必须与当前 Web 页面的域相同。这意味着浏览器隔离来自不同源的内容,以防止它们之间的操作。这个浏览器策略很旧,从 Netscape Navigator 2.0 版本开始就存在。 克服该限制的一个相对简单的方法是让 Web 页面向它源自的 Web 服务器请求数据,并且让 Web 服务器像代理一样将请求转发给真正的第三方服务器。尽管该技术获得了普遍使用,但它是不可伸缩的。另一种方式是使用框架要素在当前 Web 页面中创建新区域,并且使用 GET 请求获取任何第三方资源。不过,获取资源后,框架中的内容会受到同源策略的限制。

克服该限制更理想方法是在 Web 页面中插入动态脚本元素,该页面源指向其他域中的服务 URL 并且在自身脚本中获取数据。脚本加载时它开始执行。该方法是可行的,因为同源策略不阻止动态脚本插入,并且将脚本看作是从提供 Web 页面的域上加载的。但如果该脚本尝试从另一个域上加载文档,就不会成功。幸运的是,通过添加 JavaScript Object Notation (JSON) 可以改进该技术。

JSONP是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问。

就是我们常用的语句:<script type=”text/javascript” src=”XXX/test.php?jsonp=callbackFunction” />

只是在外调过程中增加了客户端的回调处理函数,这个函数由服器端动态组装,发给客户端执行,如:

$jsonData = getDataAsJson($_GET[''a'']);
echo $_GET[''callback''] . ''('' . $jsonData . '');'';
// prints: jsonp1232617941775({"a" : "hello", "b" : "world"});

我要评论!

想一个你喜欢的昵称。
给一个你的常用邮箱。
想和萌萌哒的TA们说点啥。
  • 谷歌发布了针对ARM优化的新算法,但是如果要使用 salsa20 或 chacha20 或 chacha20-ietf 算法,还是需要先安装 libsodium 。 CentOS下: yum install epel-release -y yum install libsodium -y 如果想自己...
  • 如果使用VMware虚拟机的时候突然系统崩溃蓝屏,有一定几率会导致无法启动,会提示:锁定文件失败。 打不开磁盘或快照所依赖的磁盘,这是因为虚拟机在运行的时候,会锁定文件,防止被修改,而如果突然系统崩溃了,虚拟机就来不急把已经锁定的文件解锁,所以你在启动的时候,就会提示无法锁定文件,如下图: 解决方法...
  • 有些时候我们会碰到此提示“该设备或资源(网站名称)未设置为接受端口“万维网服务(HTTP)”上的连接”。那么是什么样的情况导致的,分析结果如下: 1、对方的网站有请求的IP限制,非白名单中的就直接跳转到127.0.0.1上; 2、使用了本地代理,当代理有故障或者代理未及时还原时会导致; 3、DNS的...
  • 问题 -bash: killall: command not found 寻找 apt-cache search killall psmisc - Utilities that use the proc filesystem sysvinit-utils - System-V-like 工具集 安装...
  • 漏洞描述: 2017年9月5日,Struts官方发布一个严重级别的安全漏洞,该漏洞编号为:S2-052,在一定条件下,攻击者可以利用该漏洞远程发送精心构造的恶意数据包,获取业务数据或服务器权限,存在高安全风险。 漏洞定级: 高危 漏洞CVE编号: CVE-2017-9805 漏洞影响范围: Stru...
微信扫一扫即可带走我!