JSONP淺析

为什么使用JSONP

JSONP和JSON是不一样的。JSON(JavaScript Object Notation)是一种基于文本的数据交换方式,或者叫做数据描述格式。而JSONP(JSON with Padding)是一种方式或者说非强制性协议。它是为了解决某个难题而产生的一种技术方式。

为什么会用到JSONP呢?

我们平时在用ajax请求服务端数据时,一般是这么写的:

Copy
$.ajax({
 type: "get",
 url: "getData.php",
 dataType: "json",
 success: function (data, textStatus, jqXHR) {
 console.log(data);
 },
 error: function (XMLHttpRequest, textStatus, errorThrown) {
 alert('fail');
 }
});

这是一段很普通的基于jQuery的AJAX请求,不会有什么问题。注意到:url里是getData.php,说明这个文件url是基于当前服务器的,例如可能是localhost,也就是前端发出的请求来源是localhost,后端肯定也是localhost。他们俩是在同一个域名下。当然,平时我们也不会特别注意。

这时候,假如这个url变成其它服务器上的地址,例如:'http://apis.juhe.cn/mobile/get?phone=13429667914&key=',我们再把请求发送出去,会发现出问题了。大家可以手动写个示例看看。

DEMO: 为什么使用jsonp?

出什么问题了?被限制请求了!

Copy
XMLHttpRequest cannot load http://apis.juhe.cn/mobile/get?phone=13429667914&key=. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://demo.52fhy.com' is therefore not allowed access.

也就是请求来源与服务器不是同一个域名,不允许访问。这就是浏览器同源策略:

Copy
所谓"同源"指的是"三个相同":
协议相同
域名相同
端口相同
举例来说,http://www.example.com/dir/page.html这个网址,协议是http://,域名是www.example.com,端口是80(默认端口可以省略)。它的同源情况如下。
http://www.example.com/dir2/other.html:同源
http://example.com/dir/other.html:不同源(域名不同)
http://v2.www.example.com/dir/other.html:不同源(域名不同)
http://www.example.com:81/dir/other.html:不同源(端口不同)

同源政策规定,AJAX请求只能发给同源的网址,否则就报错。

那么,这时候该怎么办呢?我就是想通过js请求对方服务器上的资源!

除了架设服务器代理(浏览器请求同源服务器,再由后者请求外部服务),有三种方法规避这个限制。

  • JSONP
  • WebSocket
  • CORS

本文只对JSONP作介绍。

如何使用JSONP

首先前端这边代码得改改,假设先不用jQuery:

Copy
 

后端服务器也要改改。

例如,在PHP语言中,后端服务器在API里返回JSON数据,一般是这么写的:

Copy
$data = array('name' => '52fhy', 'age' => '22');
echo json_encode($data);
exit;

这里需要改成:

Copy
$data = array('name' => '52fhy', 'age' => '22');
handJsonp($data);
//处理jsonp
function handJsonp($data){
 $callback = $_GET['callback'] ? : 'callback'; //默认使用callback
 echo sprintf("%s(%s)", $callback, json_encode($data));
 exit;
}

一旦请求成功,服务端输出了:

Copy
handler({name: "52fhy", age: "22"});

这时候浏览器就要响应了,找到handler()方法并执行,恰好,我们提前定义好了handler()方法。

这里为什么服务端没有限制访问呢?原因是我们通过动态添加了个:

Copy
 

它的基本思想是,网页通过添加一个

@飞鸿影的Blog

JSONP浅析

0/2000字

广告

重复、旧闻

格式问题

低俗

标题夸张

与事实不符

抄袭侵犯名誉/商誉/肖像/隐私权

其他问题,我要吐槽

淫秽色情

营销广告

恶意攻击谩骂

我有话要说

淫秽色情

营销广告

恶意攻击谩骂

我有话要说


分享到:


相關文章: