如题,在网上查找JsonP的资料的时候,发现了下面这两篇文章是相当靠谱的:
http://www.ibm.com/developerworks/cn/web/wa-aj-jsonp1/
http://www.cnblogs.com/dowinning/archive/2012/04/19/json-jsonp-jquery.html
详细的信息直接看上面的两篇文章再好不过了。
这里总结一下JsonP的原理思想:
Ajax处于安全等因素的考虑,不允许跨域请求资源(这个也符合所谓的同源策略),但是HTML标签中,含有src属性的标签却不受次限制,比如<javascrip>标签。
于是,聪明的程序员利用这个特点突破了没法直接使用Ajax方式获取非本域下的资源的限制。
比如:在www.a.com这个域下,需要获得www.b.com这个域下的一个Restful的数据。
这里,假设后者已经提供了类似http://www.b.com/xxx/getABC这样的Json返回数据的封装。
类似于下面这个样子的返回结果:
{"ABC":"I am ABC"}
这样,最简单方式就是你直接在浏览器的地址栏里一敲http://www.b.com/xxx/getABC,就直接看到了上面的结果。
但是,悲剧的是:Ajax没法干这事(没法异步发个request到www.b.com/xxx/getABC,并且还获取返回结果),因为有上面说到的跨域限制。
那怎么办呢?
既然www.a.com自己没法直接请求www.b.com下的东东获得结果,但是www.b.com自己获得他下面的数据当然是没问题的。好吧,那www.a.com就和www.b.com谈判吧。后者对前者说,既然你要从我这里拿数据,那就得遵守协议啊!
为了获得数据,于是前者妥协了。。。
那么双方的协议是啥呢?
就是:www.a.com负责定义行为(就是定义javascript函数),然后把这个函数告诉www.b.com——通过把js函数名传给他的方式。(等等,不是不让跨域发请求吗?别忘了上面的蓝色字体强调的小后门哦。。。)
www.b.com统一规划什么数据能放出去,什么数据不能放出去给外人用。这里,在JsonP的处理方式下,他统一用Json的格式表示数据。在他允许放出的数据中,他接受www.a.com或者另外任何域名的js请求,并把数据放到传给他的js函数中。因为对于他来说,只要数据是可以放出来的,他不管www.a.com到底定义了啥js函数,这个js函数要干啥。
潜台词就是:数据给你了,你爱搞毛搞毛。。。爷不care!
用下面的这个链接可以看到最直观的效果:
http://www.geonames.org/postalCodeLookupJSON?postalcode=10504&country=US&callback=abc
返回的结果是这个样子的:
abc({"postalcodes":[{"adminName2":"Westchester","adminCode2":"119","postalcode":"10504","adminCode1":"NY","countryCode":"US","lng":-73.700942,"placeName":"Armonk","lat":41.136002,"adminName1":"New York"}]});
这个就是所谓的动态生成js的函数名啦!!!说白了就是,www.geonames.org上已经同意提供数据服务给其他众多的调用者,但是正因为调用者众多,www.geonames.org不可能事先知道各个调用者定义的js的函数名到底是啥,于是jsonp协议本身一个重要的方面就是规定了:调用者需要按照协议规定将你自己的js函数名告诉数据提供方!数据提供方根据调用者传入的js函数名,好人坐到底,将json数据包入这个方法中。这里例子就是上面的abc啦。
但是请注意,正是这个特殊的交互过程,使得这个js的调用和普通的js调用还真不太一样!
动态就动态在,这个js的行为和数据分离了,听起来有点违背OO的设计原则。
他的js的函数定义是由www.a.com给出的,他的js函数的入参,也就是数据是www.b.com生成的(注意,这里数据生成过程完全相当于本域内的请求,不是www.a.com哦,所以也就巧妙的绕过了Http的get请求的跨域的限制。)
上面描述的这个过程,单纯从js执行的角度去考虑,很像在www.a.com下的一个页面上,有下面这种形式定义的js:
<!--a js function named xxa has been defined in xxa.js-->
<script type="text/javascript" src="xxa.js"></script>
<!--the invocation of xxa with data happens in xxb.js-->
<script type="text/javascript" src="http://www.b.com/xxb.js"></script>
总结一下,说到底,Json是内容表示的文本协议,而Jsonp是利用Json以及html的script标签的src属性实现跨域请求的传输协议。
分享到:
相关推荐
json-viewer, 它是用于打印JSON和JSONP的Chrome 扩展 JSON查看器 你的眼睛所见过的最漂亮和可以定制的json/。 它是用于打印JSON和JSONP的Chrome 扩展。注释:这里扩展可能会与其他JSON萤火虫/格式化程序发生碰撞,你...
JSON(JavaScript Object Notation)和JSONP(JSON with Padding)是两种常见的数据交换格式,尤其在Web开发中广泛使用。本文将深入探讨这两种格式的特点、用途以及它们在跨域数据请求中的作用。 **1. JSON简介** ...
"详解JSON和JSONP劫持以及解决方法" 本文主要介绍了JSON和JSONP劫持的概念、攻击过程、解决方法以及实例代码,旨在帮助读者深入理解这两种攻击方式,并提供实际有效的解决方法。 JSON劫持 JSON劫持,也称为JSON ...
JSON(JavaScript Object Notation)和JSONP(JSON with Padding)就是为了解决这两个问题而产生的技术。 JSON是一种轻量级的数据交换格式,它基于纯文本,拥有良好的跨平台传递能力,并且与JavaScript有原生的集成...
JSONP(JSON with Padding)是JSON的一种使用模式,它允许Web页面通过`<script>`标签来跨域请求数据。由于同源策略的限制,JavaScript通常不能直接向其他域名请求数据,但`<script>`标签却不受此限制,JSONP正是利用...
json-formatter, 使 json/jsonp易于阅读 JSON格式化程序当你在浏览器选项卡中访问 in'直接'时,很好的打印JSON和tmodel的Chrome 扩展。特性JSONP支持快速,即使在长页面上有效的JSON页面- URL不重要语法高亮显示带有...
### Jsonp 关键字详解及json和jsonp的区别,ajax和jsonp的区别 #### 一、Jsonp 关键字详解 Jsonp(JSON with Padding)是一种跨域数据交互协议,它允许在一个网页中请求并获取另一个域的服务端数据。Jsonp 的工作...
JSONP(JSON with Padding)是一种解决浏览器同源策略限制的技术,允许Web页面从其他域名请求数据。由于JavaScript不能直接通过Ajax进行跨域请求,但可以加载跨域的JavaScript文件,JSONP利用这个特性,通过在服务器...
有关json与jsonp的区别(json才是目的,jsonp只是手段)介绍如下所示: 一言以蔽之,json返回的是一串数据;而jsonp返回的是脚本代码(包含一个函数调用); JSON其实就是JavaScript中的一个对象,跟var obj={}在质...
### JSON与JSONP知识点详解 #### 一、JSON简介 **JSON**(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。 ##### JSON的基本...
而JSONP(JSON with Padding)则是一种非官方的解决JSON跨域问题的技术。 在Web开发中,浏览器的同源策略(Same-Origin Policy)是一项重要的安全机制,它限制了来自不同源的“脚本”之间交互。这意味着,一个网页...
JSONP和JSON都是数据交换格式,但它们的使用场景和工作方式存在明显差异。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它以易于阅读和编写的形式存储和表示数据,易于人阅读和编写,同时也易于...
1.json与jsonp的引入 在ajax中 JSON用来解决数据交换问题,而JSONP来实现跨域。 备注:跨域也可以通过服务器端代理来解决; 理解:JSON是一种数据交换格式,而JSONP是一种依靠开发人员的聪明才智创造出的一种非官方...
因为JSON是JavaScript的子集,所以可以直接在JavaScript环境中解析和生成,无需额外的编译或解析步骤,这也是JSONP(JSON with Padding)出现的基础。 JSONP是一种非官方的跨域数据交互协议,主要解决的是浏览器...
基于原生PHP写的一套完整的IP转地址模块,支持自动获取IP,也支持查询指定IP,同时支持输出json、jsonp、txt、xml、js等多种IP和地址格式,还可以细分为国家、省、市、地区,方便在各种系统里整合与调用。...
JSONP(JSON with Padding)是一种跨域数据交互协议,它利用了`<script>`标签可以跨域请求资源的特性来实现数据的交换。在Web开发中,由于浏览器的同源策略限制,JavaScript通常无法直接访问不同源的资源,但JSONP...
JSONP(JSON with Padding)是一种跨域数据交互协议,它利用了`<script>`标签可以跨域请求资源的特性,为了解决JavaScript在浏览器端由于同源策略限制无法直接访问不同源的HTTP请求的问题。在本场景中,前端使用...
中文转换拼音,支持带或不带声调,支持把ü替换为v等任意字符,支持过滤标点符号,支持使用任意符号做连接符,同时支持json、jsonp、text、xml、js等多种输出格式 使用方法 参考实例文件:examples/examples.php ...