JSONP的实现
JSONP简介
要实现JSONP,首先得知道JSONP是干什么用的,以及如何使用。
JSONP主要用于跨域获取资源。一般来说,它的使用方法如下(以jquery为例):
$.ajax({ url: "http://query.yahooapis.com/v1/public/yql", jsonp: "callback", dataType: "jsonp", data: { q: "select title,abstract,url from search.news where query=\"cat\"", format: "json" }, success: function( response ) { console.log( response ); } });
|
JSONP的原理
我们知道,AJAX请求具有跨域的限制。但是某些标签,比如<script>
, <img>
等就没有这样的限制。因此,我们就可以利用这样的特点,突破跨域的限制。
JSONP就是利用<script>
标签能够跨域的特点来从服务器获取数据。
首先,我们前端写好请求成功后的回调函数,后端服务器会把数据当作参数传进来。比如说:
function Success(response) { console.log(response); }
|
然后我们创建一个<script>
标签,并指定src
属性,让浏览器向服务器发起请求:
let s = document.createElement("script"); s.src = "http://api.test.com?callback=Success&qeury=123"; document.documentElement.appendChild(s);
|
服务器收到请求后,可以根据url中的参数进行数据库的查询等一系列的操作,获取到前端想要的值,然后生成响应。响应的方式是调用前端之前定义好的回调函数,如下所示:
这样,前端就能把{data: "test"}
给打印出来了
JSONP的实现
知道了JSONP的原理,我们现在的目标就是设计出一套合理的接口,方便直接进行JSONP的调用。我们这里只考虑前端的事情,后端事情忽略。
function JSONP(config) { let url = config.url || ""; let callback = config.callback || ""; let data = config.data || {}; let success = config.success || function () {};
window[callback] = success;
function obj2url(obj) { let res = ""; for(let attr in obj) { res += attr + "=" + obj[attr] + "&"; } return res; }
data.callback = callback; url += obj2url(data);
let script = document.createElement("script"); script.src = url; document.documentElement.appendChild(script); }
|
至此,我们就实现了一个简陋的JSONP。