• 问题集录04--json和jsonp讲解


    JSON和JSONP
     
      JSON(Javascript Object Notation)是一种轻量级的数据交换格式,用于在浏览器和服务器之间交换信息。
     
      JSONP(JSON With Padding),就是打包在函数调用中的的JSON(或者包裹的JSON)。
     
      JSON是一种数据格式,JSONP是一种数据调用方式。

     //JSON
     {“name”: “sb” }
    //JSONP
     callback({“name”: “sb”})

      出于安全考虑,脚本(AJAX)不能访问非本域的内容。但是,静态资源是不受域策略限制的,可以加载任意域的脚本、样式、图片等静态资源,JSOP就是利用这种原理来实现跨域获取数据的。
     
    例1:

    //定义shoPrice函数
     function showPrice(data) {
         alert("Symbol: " + data.symbol + ", Price: " + data.price);
     }
     //在Web页面中包含showPrice函数和参数
     <script type="text/javascript">
     function showPrice(data) {
         alert("Symbol: " + data.symbol + ", Price: " + data.price);
     }
     </script>
    <script type="text/javascript">
    showPrice({symbol: 'IBM', price: 91.42});
    </script>

      本例展示了如何将静态JSON数据作为参数调用Javascript函数。
     
     例2:
     
      第一种的函数调用完全可以写在一个js文件中放在服务器上,用script标签加载到页面,而且这个标签可以动态地创建。

    <script type="text/javascript">
     // This is our function to be called with JSON data
     function showPrice(data) {
         alert("Symbol: " + data.symbol + ", Price: " + data.price);
     }
     
     var url = “remote.js”; // 外部脚本的URL
     // 动态插入脚本
     var script = document.createElement('script');
     script.setAttribute('src', url);
     
     // 加载script
     document.getElementsByTagName('head')[0].appendChild(script); 
     </script>

    remote.js的内容和之前在标签里写的一样是:

     
     1 showPrice({symbol: 'IBM', price: 91.42}); 
     
      动态插入的Javascript代码,将要传递的JSON数据作为参数,showPrice函数调用语句的参数。
     
      那么问题来了,每次获取到数据都调用showPrice函数吗?这就需要前后端程序猿做好约定,当然这样有很多不便,尤其是对于开放接口给公众开发的情况。JSOP这样处理:支持前端传递一个回调函数名参数,后端接收回调函数名参数,然后生成对该函数的调用,将JSON数据作为参数传递,在到达客户端时将其插入页面开始执行。
     
    例3:
     
      动态插入代码,带有callback参数:

    <script type="text/javascript">
      // This is our function to be called with JSON data
      function showPrice(data) {
          alert("Symbol: " + data.symbol + ", Price: " + data.price);
      }
     var url = “remote.js?callback='showPrice'”; // 外部脚本的URL
     // 动态插入脚本
     var script = document.createElement('script');
     script.setAttribute('src', url);
     // 加载script
     document.getElementsByTagName('head')[0].appendChild(script); 
      </script>

    后端用PHP实现的JSONP服务的代码片段:

    $jsonData = getDataAsJson($_GET['symbol']);
     echo $_GET['callback'] . '(' . $jsonData . ');';
     // 打印: showPrice({"symbol" : "IBM", "price" : "91.42"});

    很好的契合了JSONP的定义,打包在函数调用中的JSON数据。
     

    以上几个例子来自:
     
    使用 JSONP 实现跨域通信,第 1 部分: 结合 JSONP 和 jQuery 快速构建强大的 mashup
     

    在jQuery中使用JSONP
     
      AJAX和JSONP在jQuery中的调用方式看起来极为相像,千万不要被这种现象迷惑,它们本质上有很大不同。AJAX是通过XMLHttpRequest对象获取非页面内容,而JSONP是动态的添加<script>标签来调用服务器脚本。虽然jQuery把JSONP作为AJAX的一种形式进行了封装,但JSONP并不是AJAX的一种形式或一种特例。

    $.ajax({
         url: "http://query.yahooapis.com/v1/public/yql",
         jsonpCallback: "showPrice",
         jsonp: "callback",
         // tell jQuery we're expecting JSONP
         dataType: "jsonp",
         data: {
             q: "select title,abstract,url from search.news where query="cat"",
             format: "json"
         },
         // work with the response
         success: function( data ) {
             console.log( data ); // server response
         }
     });

    ajax请求参数说明:

    dataType  String

    预期服务器返回的数据类型。如果不指定,jQuery 将自动根据 HTTP 包 MIME 信息来智能判断,比如XML MIME类型就被识别为XML。在1.4中,JSON就会生成一个Javascript对象,而script则会执行这个脚本。随后服务器端返回的数据会根据这个值解析后,传递给回调函数。可用值:

    "xml": 返回 XML 文档,可用 jQuery 处理。

    "html": 返回纯文本 HTML 信息;包含的script标签会在插入dom时执行。

    "script": 返回纯文本 Javascript 代码。不会自动缓存结果。除非设置了"cache"参数。'''注意:'''在远程请求时(不在同一个域下),所有POST请求都将转为GET请求。(因为将使用DOM的script标签来加载)

    "json": 返回 JSON 数据 。

    "jsonp": JSONP 格式。使用 JSONP 形式调用函数时,如 "myurl?callback=?" jQuery 将自动替换 ? 为正确的函数名,以执行回调函数。

    "text": 返回纯文本字符串
     
    jsonp,
     
      重写jsonp请求中的回调函数的名称。至俄格值用来替代“callback=?”这种GET或POST请求URL参数里的“callback”部分,例如{jsonp:'onJsonPLoad'}会导致“onJsonPLoad”传递给服务器。
     
    jsonpCallback,
     
      为jsonp指定一个回调函数名。这个值将用来取代jQuery自动生成的随机函数名。这主要用来让jQuery生成度独特的函数名,这样管理请求更容易,也能方便地提供回调函数和错误处理。你也可以在想让浏览器缓存GET请求的时候,指定这个回调函数名。但是实际使用过程中,并不用写回调函数,比如此例中的showPrice,不写也不会报错,因为jQuery在处理JSONP的时候,自动帮你生成回调函数并且把数据取出来共success方法调用。可能像这样:

     function success_jsonpCallback(data) { success(data); }  
  • 相关阅读:
    大爽Python入门教程 45 实践使用
    大爽pyqt5笔记&教程 四 布局 Layout 对其
    大爽Python入门教程 47 答案
    大爽Python入门教程 46 习题
    大爽Python入门教程 43 函数传参 形参、实参 default、*args、**kwargs
    大爽Python入门教程 41 初识函数Function
    大爽Python入门教程 56 实践练习 功能添加
    检测密码是否能过强度检测(正则表达式检测)
    常用加密算法汇总一下
    [转]技术人员,你拿什么拯救你的生活温水煮青蛙
  • 原文地址:https://www.cnblogs.com/tanwei81/p/6813819.html
Copyright © 2020-2023  润新知