当前位置 主页 > 服务器问题 > win服务器问题汇总 >

    jsonp格式前端发送和后台接受写法的代码详解

    栏目:win服务器问题汇总 时间:2019-11-19 09:28

    什么是JSONP?

    先说说JSONP是怎么产生的:

    其实网上关于JSONP的讲解有很多,但却千篇一律,而且云里雾里,对于很多刚接触的人来讲理解起来有些困难,小可不才,试着用自己的方式来阐释一下这个问题,看看是否有帮助。

    1、一个众所周知的问题,Ajax直接请求普通文件存在跨域无权限访问的问题,甭管你是静态页面、动态网页、web服务、WCF,只要是跨域请求,一律不准;

    2、不过我们又发现,Web页面上调用js文件时则不受是否跨域的影响(不仅如此,我们还发现凡是拥有"src"这个属性的标签都拥有跨域的能力,比如<script>、<img>、<iframe>);

    3、于是可以判断,当前阶段如果想通过纯web端(ActiveX控件、服务端代理、HTML5之Websocket等方式不算)跨域访问数据就只有一种可能,那就是在远程服务器上设法把数据装进js格式的文件里,供客户端调用和进一步处理;

    4、恰巧我们已经知道有一种叫做JSON的纯字符数据格式可以简洁的描述复杂数据,更妙的是JSON还被js原生支持,所以在客户端几乎可以随心所欲的处理这种格式的数据;

    5、这样子解决方案就呼之欲出了,web客户端通过与调用脚本一模一样的方式,来调用跨域服务器上动态生成的js格式文件(一般以JSON为后缀),显而易见,服务器之所以要动态生成JSON文件,目的就在于把客户端需要的数据装入进去。

    6、客户端在对JSON文件调用成功之后,也就获得了自己所需的数据,剩下的就是按照自己需求进行处理和展现了,这种获取远程数据的方式看起来非常像AJAX,但其实并不一样。

    7、为了便于客户端使用数据,逐渐形成了一种非正式传输协议,人们把它称作JSONP,该协议的一个要点就是允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名来包裹住JSON数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了。

    什么是JSON?

    前面简单说了一下,JSON是一种基于文本的数据交换方式,或者叫做数据描述格式,你是否该选用他首先肯定要关注它所拥有的优点。

    JSON的优点:

    1、基于纯文本,跨平台传递极其简单;

    2、Javascript原生支持,后台语言几乎全部支持;

    3、轻量级数据格式,占用字符数量极少,特别适合互联网传递;

    4、可读性较强,虽然比不上XML那么一目了然,但在合理的依次缩进之后还是很容易识别的;

    5、容易编写和解析,当然前提是你要知道数据结构;

    JSON的缺点当然也有,但在作者看来实在是无关紧要的东西,所以不再单独说明。

    好了,回归正题,

    jsonp是ajax提交的一种格式不会受跨域限制

    一.前端发送

    <button>11111</button>
    <script src="https://cdn.static.runoob.com/libs/jquery/1.8.3/jquery.js"></script>
    <script>
      document.querySelector('button').onclick = function () {
        $.ajax({
          url: 'http://localhost:8000/test',
          type: 'get',
          dataType: 'jsonp',
          data: {      //注意内容必须为字典
            aaa:aaa    //字典里内容前面key可以不加"",默认会给你加上""变成字符串但是不会当成变量
          },         //字典后面value有''为字符串,没有为变量
          success: function (data) {
            console.log(data);
          }
        });
      }
    </script>

    二.后台接受

    #我就拿python举例,其他也大同小异
    from django.shortcuts import render,HttpResponse,redirect
    def test(request):
      callback=request.GET.get('callback')
      print(dict(request.GET)) #传过来的内容他会打散,具体的自己看一下就知道
      
      #注意点返回的字符串必须是 'callback+("返回的字符串")' 这样的一个字符串,不然前端不会接收
      return HttpResponse(callback+'("ok")')