Django之JSONP跨域请求【交互篇七】

版权声明:本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。本文为博主原创文章,转载请附上博文链接! https://blog.csdn.net/Burgess_zheng/article/details/86558947

上一篇:Django之ajax文件上传的两种方式和ifname上传文件【交互篇六】https://blog.csdn.net/Burgess_zheng/article/details/86558155

下一篇:Django之前后端交互篇目录https://blog.csdn.net/Burgess_zheng/article/details/86563865

目录


JSONP简单理解:

由于同源策略,前端阻止了ajax请求外网的,而我们有这个需求进行请求外网API虎丘数据应用到我们的前端,所以jsonp是作用就是解决同源策略的影响

同源策略介绍:

同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。
      1.同源策略,它是由Netscape提出的一个著名的安全策略。
      2.现在所有支持JavaScript 的浏览器都会使用这个策略。
      3.所谓同源是指,域名,协议,端口相同。
      4.当一个浏览器的两个tab页中分别打开来 百度和谷歌的页面
      5.当浏览器的百度tab页执行一个脚本的时候会检查这个脚本是属于哪个页面的,
      6.即检查是否同源,只有和百度同源的脚本才会被执行。 [1] 
      7.如果非同源,那么在请求数据时,浏览器会在控制台中报一个异常,提示拒绝访问

为什么要使用JSONP?

1我们自己的浏览器发给了自己的server,
2我们自己的server向外部发请求,
3拿到结果返回给我们的server
4.server拿到结果后我我们应用到我们的浏览器
所以向外部发请求就多了几个步骤(效率太低),而我们希望的是没必要通过我们的server
所以浏览器想要直接向外部发只能通过js来发(但是同源策略阻止js(ajax))

JSONP的两种实现方式

  后端

def jsonp(request):
    func = request.GET.get(call)
    content = '%s(10000)' %(func,)
    return HttpResponse(content)

  前端

  原生html实现jsonp

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <input type="button" value="获取数据" onclick="getContent();"/>
    <script src="/static/jquery-1.12.4.js"></script>
    <script>
        function getContent(){

            //原生html实现jsonp
            var tag = document.createElement('script');
            tag.src = 'http://www.jxntv.cn/data/jmd-jxtv2.html?callback=list&_=1454376870403';
            //对方响应回来的数据为list(参数),自动调用了function list(arg){}
            document.head.appendChild(tag);
            //该tag标签放在head头部标签下
            document.head.removeChild(tag)
            //移除掉该标签

        function list(arg){
            console.log(arg)
        }

    </script>

</body>
</html>

  jquery实现jsonp

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <input type="button" value="获取数据" onclick="getContent();"/>
    <script src="/static/jquery-1.12.4.js"></script>
    <script>
        function getContent(){

            //jquery实现jsonp
            $.ajax({
                url:'http://www.jxntv.cn/data/jmd-jxtv2.html?_=1454376870403',
                type:'POST',//如果是JSONP 内部自动请求类型转成GET
                dataType:'jsonp',
                jsonp:'callback',//get请求的key
                jsonpCallback:'list'//get请求的value
            })
        }
        function list(arg){
            console.log(arg)
        }

    </script>

</body>
</html>

其实还有另外一种方式: CORS(跨站资源共享)

上一篇:Django之ajax文件上传的两种方式和ifname上传文件【交互篇六】https://blog.csdn.net/Burgess_zheng/article/details/86558155

下一篇:Django之前后端交互篇目录https://blog.csdn.net/Burgess_zheng/article/details/86563865

猜你喜欢

转载自blog.csdn.net/Burgess_zheng/article/details/86558947
今日推荐