JQuery中Jsonp实现原理(Ajax)

JSONP原理

1、判断请求与当前页面的域是否同源,如果同源,则发送正常的Ajax,就没有跨域的事情了;

2、如果不同源,会生成一个script标签

3、生成一个随机的callback名字,还得创建一个名为该名字的方法

4、设置script标签的src,设置为要请求的接口

5、将callback作为参数拼接在后面

=以上是前端部分==

6、后端接收到请求后,开始准备要返回的数据

7、后端拼接数据,将要返回的数据用callback的值和括号包裹起来

例如:callback=asd123456,要返回的数据为{“a”: 1, “b”: 2}

​ 就要拼接为:asd123456({“a”: 1, “b”: 2});

8、将内容返回

=以上是后端部分==

9、浏览器接收到内容,会当作js代码来执行

10、从而执行名为asd123456的方法,这样我们就接收到了后端返回给我们的对象

JS封装jsonp前后端数据交互

var $ = {
    ajax: function(options){
        var url = options.url;
        var type = options.type;
        var dataType = options.dataType;
        //判断是否同源(协议、域名、端口号)
        //获取目标url的域
        var targetProtocol = "";//目标接口的协议
        var targetHost = "";//目标接口的host,host是包含域名和端口的
        //如果url中不带http,那么访问的一定是相对路径,相对路径一定是同源的
        if (url.indexOf("http://") === 0 || url.indexOf("https://") === 0){
            var targetUrl = new URL(url);
            targetProtocol = targetUrl.protocol;
            targetHost = targetUrl.host;
        }else{
            targetProtocol = location.protocol;
            targetHost = location.host;
        }
        //首先判断是否为jsonp,因为不是jsonp不用做其它的判断,直接发送ajax
        if (dataType === 'jsonp'){
            //要看是否同源
            if (location.protocol === targetProtocol && location.host === targetHost){
                //此处省略,因为同源,jsonp会当作普通的ajax做请求
            }else{
                //不同源,跨域
                //随机生成一个callback
                var callback = 'cb' + Math.floor(Math.random() * 1000000);
                //给window上添加一个方法
                window[callback] = options.success;
                //生成script标签
                var script = document.createElement('script');
                if (url.indexOf("?") > 0){
                    //表示已经有参数了
                    script.src = url + "callback=" + callback;
                }else {
                    //表示没有参数
                    script.src = url + "?callback=" + callback;
                }
                script.id = callback;
                document.head.appendChild(script);
            }
        }
    }
}
$.ajax({
    url: "http://developer.duyiedu.com/edu/testJsonp",
    type: "get",
    dataType: 'jsonp',
    success: function(data){
        console.log(data);
    }
})

通过JSONP可实现前后端同源及非同源数据的交互

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值