• 用原生js来处理跨域的数据(jsonp)


    说明总结:

    1.ajax和jsonp其实本质上是不同的东西。ajax的核心是通过XmlHttpRequest获取非本页内容,而jsonp的核心则是动态添加<script>标签来调用服务器提供的js脚本

    2.但是ajax和jsonp在数据传输的过程中都是可以用json格式的数据。

    3.其实ajax与jsonp的区别不在于是否跨域,ajax通过服务端代理一样可以实现跨域,jsonp本身也不排斥同域的数据的获取。

    4.ajax和jsonp这两种技术在调用方式上“看起来”很像,目的也一样,都是请求一个url,然后把服务器返回的数据进行处理,因此jquery和ext等框架都把jsonp作为ajax的一种形式进行了封装;

    服务器端代码:

     1 //获取客户端的信息
     2     if (isset($_GET['code'])) {
     3         if ($_GET['code'] == "CA1998") {
     4             $flightId = $_GET['code'];
     5             $price = 1000;
     6         }
     7         else if ($_GET['code'] == "CA1997") {
     8             $flightId = $_GET['code'];
     9             $price = 2000;
    10         }
    11         else{
    12             $flightId = 0;
    13             $price = 0;
    14         }
    15         $flightHandler = array('flightId'=>$flightId,'price'=>$price); 
    16         $flightHandler = json_encode($flightHandler);
    17         $flightHandler = "flightHandler(".$flightHandler .");";// 将数据进行了包装,包装成了一个调用的函数,这一步很重要。
    18         print_r($flightHandler);
    19     }

    获取到的服务器数据:

    1 flightHandler({
    2     "flightId": "CA1998",
    3     "price": 2000
    4 });
    5 //其实就在服务器端把json数据包装成了一个js的函数,将一个对象作为参数放在函数里面。所以跟ajax用XMLHttpRequest接收数据是不一样的。

    传统ajax获取到的json数据:

    1 {
    2     "flightId": "CA1998",
    3     "price": 2000
    4 }

    客户端代码:

     1 <!doctype html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>XHR</title>
     6     <link rel="stylesheet" href="../templates/css/verify.css">
     7 </head>
     8 <body>
     9     <label for="flightId">输入:CA1998 或者 CA1997 </label> <input type="text" id="flightId" name="flightId"> <input type="button" value="原生js获取jsonp数据(php包装数据)" onclick="flightHandler0()"><input type="button" value="原生js获取jsonp数据(js包装数据)" onclick="flightHandler1()">
    10  <script type="text/javascript">
    11 
    12     // 得到航班信息查询结果后的回调函数
    13     function flightHandler(data){
    14         if (data.price != 0) {
    15              alert('你查询的航班结果是:票价 ' + data.price + ' 元,' + '航班 ' + data.flightId );
    16         } else{
    17             alert("EORROR");
    18         };
    19        
    20     };
    21 
    22     function flightHandler0(){
    23         var flightId = document.getElementById('flightId').value;
    24          //供jsonp服务的url地址(不管是什么类型的地址,最终生成的返回值都是一段javascript代码)
    25          //其实参数都是前端和后台程序员规定的,前端传过去,后端判断获取即可。
    26         var url = "flightResult.php?code=" + flightId +"&callback=flightHandler";
    27         // 创建script标签,设置其属性
    28         var script = document.createElement('script');
    29         script.setAttribute('src', url);
    30         // 把script标签加入head,此时调用开始
    31         document.getElementsByTagName('head')[0].appendChild(script); 
    32     };
    33 
    34     </script>
    35 </body>
    36 </html>

    设想:

    上面的方法是在服务器端把json数据包装在回调函数里面,那能不能在客户端来做这个事情呢?但是试了一下感觉行不通。

    在服务器端把

    $flightHandler = "flightHandler(".$flightHandler .");";

    去掉。

    留言中有用jquery写的jsonp的例子。

    最后附上用原生js和jquery分别处理jsonp的例子:

    js:http://snowinmay.net/ajax/xhr-js-jsonp.html

    jsonp:http://snowinmay.net/ajax/xhr-jquery-jsonp.html

    所以返回数据应该是json数据,但是在客户端好像没有很好的办法来包装这个数据。如果有的话以后再补充。

  • 相关阅读:
    Zuul转发请求时HttpHostConnectException can't cast to ZuulException问题解决方法
    mysql循环插入千万级数据
    ssh登录原理及免密登录配置
    mysql binlog抽取某个表的数据
    ssh方式请求gitlab需要密码解决方法
    linux使用shell脚本停止java进程
    centos7安装docker-ce
    FutureTask详解
    Boolean.getBoolean用法
    mysql对emoji的支持
  • 原文地址:https://www.cnblogs.com/snowinmay/p/3200705.html
Copyright © 2020-2023  润新知