JSONP跨域实现

什么是JSONP?

  • JSONP的全程是JSON with padding是json的一种使用模式,在实际使用中我们知道Ajax请求资源存在跨域的问题,无论是脚本,页面,json,样式。只要不符合同源策略都没有办法访问到
  • 但是,其实调用JavaScript文件好像没有受到跨域的影响(其实但凡只要拥有src属性的都拥有跨域的能力,例如<\script>、<\img>、<\iframe>)
  • 于是比较主流的跨域访问数据就是在远程服务器上设法把数据装进js格式的文件里,供客户端调用和进一步处理。
  • 这样就衍生出一种解决方案:与调用脚本一模一样的方式,来调用跨域服务器上动态生成的js格式文件(一般以JSON为后缀),显而易见,服务器之所以要动态生成JSON文件,目的就在于把客户端需要的数据装入进去。
    • 假设客户期望返回JSON数据:{name:"shadow",gender:"M",age:24}
    • JSONP真正返回客户的数据显示为 ;show({name:"shadow",gender:"M",age:24})
  • 客户端在对JSON文件调用成功之后,也就获得了自己所需的数据,剩下的就是按照自己需求进行处理和展现了,这种获取远程数据的方式看起来非常像AJAX,但其实并不一样
  • 这样的解决方案就逐渐形成了一种非正式传输协议:JSONP, 该协议的一个要点就是允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名来包裹住JSON数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了

什么是同源策略

  • 同源策略指域名,协议,端口相同。所谓“同源策略“,简单的说就是基于安全考虑,当前域不能访问其他域的东西
  • 示例图 引用自 CDSNBLOG
  • JSONP跨域实现_第1张图片

JSONP的原生API简单实现

//展示方法,打印跨域数据
var show = function(data){
    console.log(data);
};
//原生jsonp简单实现,动态添加script引用
var jsonp = function(url,callback){
  var jsonpScript=document.createElement('script');
  jsonpScript.setAttribute('src', `${url}&callback=${callback}`);
  document.getElementsByTagName('head')[0].appendChild(jsonpScript);
}
jsonp("https://api.douban.com/v2/book/search?q=json&count=1","show")

示例-调用豆瓣的API接口(Jquery方式)

  • 了解了JSONP实现跨域的方式.下面这个例子就很好理解了
  • jquery 实现源码
//展示方法,打印跨域数据
var show = function(data){
    console.log(data);
};
/**
 * 远端调用豆瓣API接口 callback参数指定了返回数据调用的回调函数的名称
 * jsonCallback:show 指定jsonCallback会在请求路径中添加callback参数 例如:
 *  https://api.douban.com/v2/book/search?q=json&count=1&callback=show
 */
$.ajax({
    url:"https://api.douban.com/v2/book/search?q=json&count=1",
    type:"GET",
    dataType:"jsonp",
    jsonpCallback:"show",
    sunccess:function (data) {
        console.log(data);
    }
});
  • JSONP跨域实现_第2张图片

参考文档

  • 博客园

转载于:https://my.oschina.net/shadowli/blog/2986895

你可能感兴趣的:(JSONP跨域实现)