jsonp总结

jsonp总结

1、jsonp原理
JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。由于同源策略,一般来说位于 server1.example.com 的网页无法与不是 server1.example.com的服务器沟通,而 HTML 的< script> 元素是一个例外。利用 < script> 元素的这个开放策略,网页可以得到从其他来源动态产生的 JSON 资料,而这种使用模式就是所谓的 JSONP。用 JSONP 抓到的资料并不是 JSON,而是任意的JavaScript,用 JavaScript 直译器执行而不是用 JSON 解析器解析。
注:jsonp的使用,是需要后端配合,

2、前端封装jsonp请求
其中的callback是前后端约定好的

    (function(window, document, undefined ){
        // 回调函数+时间戳
        var cbName = 'callback_' + new Date().getTime();
        // 判读查询字符串最后一位是否为?或者是&
        var queryString += url.indexOf('?') === -1 ? '?':'&';
        for(var k in data) {
            queryString += k + '=' + data[k] + '&'
        }
        // 查询字符串加上回调函数
        queryString += 'callback=' + cbName;
        var jsonp = function(url, data, callback ) {
            // 创建script标签
            var ele = document.createElement("script");
            // 给script标签添加src属性值
            ele.src = url + queryString;
            window[cbName] = function(data) {
                callback(data);
                document.body.removeChild(ele);
            }
            // 添加到body尾部
            document.body.appendChild(ele);
        }
        //jsonp函数暴露给window
        window.$jsonp = jsonp;
    })(window, document, undefined )

    // 调用方法
    $jsonp('http://api.douban.com/v2/movie/in_theaters',{
        'count':1
    },function(data){
        console.log(data)
    })

3、服务端代码,以PHP举例
其中的callback是前后端约定好的

    <?php
        $cb = $_GET['callback'];
        $data = array(
                    'name'=> 'zs',
                    'age'=>18,
                    'gender'=>true
                );
        echo $cb.'('.json_encode($data).')';
    ?>

4、总结
当调用jsonp请求后,会创建一个script标签,如下,其实手写也是一样的,当请求成功后,就会去执行callback_1534765080387这个函数,这个新增的标签一定要在callback_1534765080387回调函数的后面,否则不会执行callback_1534765080387函数

<script src="http://api.douban.com/v2/movie/in_theaters?count=1&callback=callback_1534765080387"></script>
// 返回的数据格式如下
callback_1534765080387({'count':1,'start':0...})

5、参考引入
https://blog.csdn.net/u012780176/article/details/79490185
https://www.cnblogs.com/lijinblogs/p/5782502.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值