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

时间:2022-08-28 17:20:00

前言:本人自学前端开发,一直想研究下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浏览器调试,我们发现报错如图:

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

此处我们使用设置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);
?>