1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > html中通过js获取接口JSON格式数据解析以及跨域问题

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

时间:2018-12-24 13:42:15

相关推荐

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

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

正文:

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

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

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

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

var url3 = '/ApiService/msgget.php';

$.get(url3,function(data){

alert(data);

});

此时如果对data采用json解析数据,得到的值为undefined。所以我们使用这种get方法获取到的值要是JSON格式,需要定义获取的数据类型为json格式,上例子:

var url3 = '/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功能比较强大,自己可以去查相关资料学习了解(/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="///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:');

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

例如允许 与 可以跨域访问

<?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(

'',

''

);

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);

?>

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。