• html中通过js获取接口JSON格式数据解析以及跨域问题


    前言:本人自学前端开发,一直想研究下js获取接口数据在html的实现,顺利地找到了获取数据的方法,但是有部分接口在调用中出现无法展示数据。经查,发现时跨域的问题,花费了一通时间,随笔记录下过程,以方便后来的童鞋。欢迎指正。

    正文:

    一、使用js获取接口数据的方法

    ①$get(url,[data],[callback])

    url:请求的地址;data:请求数据的列表;callback:请求成功后的回调函数,该函数接受两个参数,第一个为服务器返回的数据,第二个为服务器的状态,是可选参数。

    其中服务器返回数据的格式其实是字符串形式,并不是我们想要的JSON数据格式。上例子:

    var url3 = 'http://mshop.gemstc.com/ApiService/msgget.PHP';  
           $.get(url3,function(data){  
      alert(data);
            
           }); 

    此时如果对data采用json解析数据,得到的值为undefined。所以我们使用这种get方法获取到的值要是JSON格式,需要定义获取的数据类型为json格式,上例子:
    var url3 = 'http://mshop.gemstc.com/ApiService/msgget.php';  
           $.get(url3,function(data){  
         $('#result').append('<p>interval:'+data.name+'</p>')    //此时返回的是JSON格式的内容,例:我们可以使用data.name获取到name字段的值并输出。
              }, 'json'); 

    
    

    ②$post(url,[data],[callback],[type])

    post方法中多了一个type:获取数据的类型格式,post其实和get是一样的用法,type不定义,返回的是字符串类型的,定义为json格式,返回的就是json格式的数据,此处可以仿照上面的get方法,把get改成post就搞定了,就不多说了。

    ③$ajax(opiton)

    ajax功能比较强大,自己可以去查相关资料学习了解(http://blog.csdn.NET/wolf6699/article/details/50039627),可以有很多精确的控制,这里直接上例子:

    $.ajax({
       url: url,
    data:{Full:"fu"},
    type: "POST",
    dataType:'json',
     success:function(data){
          $('#result').append('<p>interval:'+data.interval+'</p>')
         //alert("22");    
     },
       error:function(er){
          //alert("11");
           BackErr(er);
     }
    });

    ④$getJSON(url,[data],[callback])

    此处参数和get方法是一致的,直接上例子:

    $.getJSON(url,function(data){
             alert(data.name);           
        });

    以上类型因为接口访问时没有带参数,所以[data]这个参数我都省去了。如果有参数的话,格式为:

    {  
        id      : 'Robin',  
        password: '123456',  
        gate    : 'index'  
      }

    二、跨域问题的解决

    在使用以上方法获取接口数据的过程中,我们突然发现有些接口无法将数据获取展示出来,使用chrome浏览器调试,我们发现报错如图:

    此处我们使用设置Access-Control-Allow-Origin来实现跨域访问。

    在被请求的Response header中加入

    // 指定允许其他域名访问
    header('Access-Control-Allow-Origin:*');
    // 响应类型
    header('Access-Control-Allow-Methods:POST');
    // 响应头设置
    header('Access-Control-Allow-Headers:x-requested-with,content-type');

    这样就可以实现ajax的跨域访问。

    此处贴上示例代码以帮助大家上手,例HTML代码:

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <html>
     <head>
      <meta http-equiv="content-type" content="text/html;charset=utf-8">
      <title> 跨域测试 </title>
      <script src="//code.jQuery.com/jquery-1.11.3.min.js"></script>
     </head>
     <body>
        <div id="show"></div>
        <script type="text/JavaScript">
        $.post("http://xxx.xxx.xxx/data.php",{name:"fdipzone",gender:"male"})
          .done(function(data){
            document.getElementById("show").innerHTML = data.name + ' ' + data.gender;
          });
        </script>
     </body>
    </html>

    php代码:http://xxx.xxx.xxx/data.php

    <?php
    $ret = array(
        'name' => isset($_POST['name'])? $_POST['name'] : '',
        'gender' => isset($_POST['gender'])? $_POST['gender'] : ''
    );

    header('content-type:application:json;charset=utf8');
    header('Access-Control-Allow-Origin:*');
    header('Access-Control-Allow-Methods:POST');
    header('Access-Control-Allow-Headers:x-requested-with,content-type');

    echo json_encode($ret);
    ?>

    这里Access-Control-Allow-Origin:*表示允许任何域名跨域访问。

    如果需要指定某域名才允许跨域访问,只需把Access-Control-Allow-Origin:*改为Access-Control-Allow-Origin:允许的域名

    例如:header('Access-Control-Allow-Origin:http://www.baidu.com');

    如果需要设置多个域名允许访问,这里需要用php处理一下

    例如允许 www.baidu.com 与 www.sina.com 可以跨域访问

    <?php
    $ret = array(
        'name' => isset($_POST['name'])? $_POST['name'] : '',
        'gender' => isset($_POST['gender'])? $_POST['gender'] : ''
    );
    header('content-type:application:json;charset=utf8');
    $origin = isset($_SERVER['HTTP_ORIGIN'])? $_SERVER['HTTP_ORIGIN'] : '';
    $allow_origin = array(
        'http://www.baidu.com',
        'http://www.sina.com'
    );
    if(in_array($origin, $allow_origin)){
        header('Access-Control-Allow-Origin:'.$origin);
        header('Access-Control-Allow-Methods:POST');
        header('Access-Control-Allow-Headers:x-requested-with,content-type');
    }
    echo json_encode($ret);
    ?>

  • 相关阅读:
    CC_UNUSED_PARAM 宏含义的解释
    JAVA 字符串编码总结
    cocos-html5 Json 灵活 遍历方式 不同方式的缺陷,优点总结
    selenium--获取HTML源码断言和URL地址
    django -- 路由
    selenium--表格和复选框的定位
    selenium--加载浏览器配置
    django -- 视图
    django -- 母版继承
    selenium--浏览器窗口截图
  • 原文地址:https://www.cnblogs.com/zst062102/p/6496405.html
Copyright © 2020-2023  润新知