天天看点

JSONP原理及其使用

jsonp主要是为了解决跨域访问问题而产生的,其返回的数据格式一般就是一个js脚本,这个脚本有以下特点:

  1. 返回的js脚本通常是服务端动态生成的。
  2. 整个脚本通常有且仅有一条语句,且是一个函数调用。
  3. 脚本中调用到的函数,是页面上存在的一个函数,其函数名通过get参数传递给服务端,服务端再将其回写到js脚本中。
  4. 函数的参数,是服务端处理后的结果数据,以json格式直接写在脚本中。这也是jsonp得名的由来。

因为,ajax是不允许跨域访问的,所以要从其他站点获取数据时,就需要经过一些特殊的手段才行,jsonp就是一种成本比较低的手段(此外还有服务端代理等方式)。jsonp主要是利用了<script><img><iframe>标签可以跨域访问的特点。具体的步骤如下:

  1. 首先,在本地页面上事先准备好一个用于接受返回数据的函数,比如:function showList(listdata){...};
  2. 其次,在需要的时点静态或动态地创建一个标签,比如:<script type="text/javascript" src="http://another.website/jsonp_call?arg1=xx&arg2=xx&callback=showList" ></script>,其中:
    1. another.website:是另外一个站点的域名或ip地址。
    2. jsonp_call:是该站点提供的一个动态内容访问的服务,可用php、java等任何技术实现。
    3. arg1、arg2:是该服务所需要的参数
    4. callback:是用于返回结果的回调函数名。
  3. 然后,another.website站点接收到这个jsonp_call的请求后,进行相应的处理,并将放回的结果封装为一个js脚本,其内容类似这样的形式:showList([{id:1,name:'a'}, {id:2,name:'b'}, ..., {id:n,name:'NNN'}]);
  4. 最后,结果返回到客户端后,就会自动解析并执行这个showList函数。

这样就完成了从“向其他站点发起请求”到“接收其他站点的应答数据”的整个过程,并且突破了ajax跨域访问的限制。

继续阅读