jsonp主要是为了解决跨域访问问题而产生的,其返回的数据格式一般就是一个js脚本,这个脚本有以下特点:
返回的js脚本通常是服务端动态生成的。
整个脚本通常有且仅有一条语句,且是一个函数调用。
脚本中调用到的函数,是页面上存在的一个函数,其函数名通过get参数传递给服务端,服务端再将其回写到js脚本中。
函数的参数,是服务端处理后的结果数据,以json格式直接写在脚本中。这也是jsonp得名的由来。
因为,ajax是不允许跨域访问的,所以要从其他站点获取数据时,就需要经过一些特殊的手段才行,jsonp就是一种成本比较低的手段(此外还有服务端代理等方式)。jsonp主要是利用了<script><img><iframe>标签可以跨域访问的特点。具体的步骤如下:
首先,在本地页面上事先准备好一个用于接受返回数据的函数,比如:function showList(listdata)...;
其次,在需要的时点静态或动态地创建一个标签,比如:<script type="text/javascript" src="http://another.website/jsonp_call?arg1=xx&arg2=xx&callback=showList" ></script>,其中:
another.website:是另外一个站点的域名或ip地址。
jsonp_call:是该站点提供的一个动态内容访问的服务,可用php、java等任何技术实现。
arg1、arg2:是该服务所需要的参数
callback:是用于返回结果的回调函数名。
然后,another.website站点接收到这个jsonp_call的请求后,进行相应的处理,并将放回的结果封装为一个js脚本,其内容类似这样的形式:showList([id:1,name:'a', id:2,name:'b', ..., id:n,name:'NNN']);
最后,结果返回到客户端后,就会自动解析并执行这个showList函数。
这样就完成了从“向其他站点发起请求”到“接收其他站点的应答数据”的整个过程,并且突破了ajax跨域访问的限制。
#需要被处理的jsonp数据
JSONP = "jsonpreturn({‘c‘: 1, ‘d‘: 2});"
#处理方法
def jsonp_to_json(JSONP):
JSONP = JSONP.strip(‘;‘)
#函数名称和要处理的jsonp数据前面部分一致
def jsonpreturn(lists):
return lists
e = eval(JSONP)
return e
#调用方法,得到处理后的结果
ret = jsonp_to_json(JSONP)
print ret,type(ret)
ps: eval()内置函数是将字符串str当成有效的表达式来求值并返回计算结果
处理这种数据还挺方便,但是如果是用来开发要慎用~也是有风险