AJAX之JSON与JSONP
AJAX目前常问的两个面试题
1、AJAX以何种格式来交换数据?
2、跨域的需求如何解决?
这两个问题目前都有不同的解决方案,比如数据可以用自定义字符串来描述,跨域可以通过服务器端代理来解决。
到目前为止最被推崇的方案还是用JSON来传数据,靠JSONP来跨域。而这就是本节将要讲述的内容。
JSON&&JSONP
JSON和JSONP虽然只有一个字母的差别,但本质差距较大:
1、JSON是一种数据交换格式
2、而JSONP是开发人员创造出的一种非官方跨域数据交互协议。
通俗理解:
拿谍战片来打个比方,JSON是地下党们用来书写和交换情报的“暗号”,而JSONP则是接头方式。通俗理解,一个是传递信息格式,一个是信息给对方的传递交互协议。
接下来依次介绍下… …
JSON
(1)什么是JSON?
JSON是一种基于文本的数据交换方式,或者叫做数据描述格式
(2)优势?
①基于纯文本,跨平台传递极其简单
②Javascript原生支持,后台语言几乎全部支持;
③轻量级数据格式,占用字符数量极少,特别适合互联网传递;
④可读性较强,虽然比不上XML那么一目了然,但在合理的依次缩进之后还是很容易识别的;
⑤容易编写和解析
JSONP
【发展】正式介绍前,先来介绍下,JSONP来源/出现缘由,以便更好地理解… …
1、一个众所周知的问题,Ajax直接请求普通文件存在跨域无权限访问的问题,不管是静态/动态网页、web服务,只要是跨域请求,一律不准;
2、后来发现,Web页面上调用js文件时,不受跨域的影响(不仅如此,还发现凡是拥有"src"这个属性的标签都拥有跨域的能力,比如
伪命题
【误区】:
对于经常用jQuery的开发者来说,知道jQuery封装的
.
a
j
a
x
中
有
d
a
t
a
T
y
p
e
属
性
,
如
果
将
该
属
性
设
置
成
d
a
t
a
T
y
p
e
:
"
j
s
o
n
p
"
,
就
能
实
现
J
S
O
N
P
跨
域
了
。
需
要
了
解
的
一
点
是
,
虽
然
j
Q
u
e
r
y
将
J
S
O
N
P
封
装
在
.ajax中有dataType属性,如果将该属性设置成dataType:"jsonp",就能实现JSONP跨域了。 需要了解的一点是,虽然jQuery将JSONP封装在
.ajax中有dataType属性,如果将该属性设置成dataType:"jsonp",就能实现JSONP跨域了。需要了解的一点是,虽然jQuery将JSONP封装在.ajax中,但是其本质与$.ajax不一样。JSONP的最基本的原理是:动态添加一个
伪命题(false proposition)是指不真实的命题。
两种情况:其一是不符合客观事实;
其二是不符合一般事理和科学道理。
另一种解释是指没有意义的命题,无法断定其真假,既不是先天的分析命题,也不是可以通过经验判断的综合命题。比如,“团结比原子弹还厉害”,”凡事都有例外”这类命题就属于伪命题。
事实来讲,例如“人终有一死”这事没有例外… …
伪命题
1、ajax和jsonp这两种技术在调用方式上“看起来”很像,目的也一样,都是请求一个url,然后把服务器返回的数据进行处理,因此jquery和ext等框架都把jsonp作为ajax的一种形式进行了封装;
2、ajax和jsonp本质上是不同的东西。ajax的核心是通过XmlHttpRequest获取非本页内容,而jsonp的核心则是动态添加
伪命题解析:
如果设为dataType: ‘jsonp’,这个$.ajax方法就和ajax XmlHttpRequest没什么关系了,取而代之的则是JSONP协议。
而JSONP是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问。
总而言之,jsonp不是ajax的一个特例,哪怕jquery等巨头把jsonp封装进了ajax,也不能改变着一点!