js 跨域获取 html数据库,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('

interval:'+data.name+'

')    //此时返回的是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('

interval:'+data.interval+'

')

//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浏览器调试,我们发现报错如图:

c72f20f19df94f9d6278df9251715add.png

此处我们使用设置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代码:

跨域测试 

$.post("http://xxx.xxx.xxx/data.php",{name:"fdipzone",gender:"male"})

.done(function(data){

document.getElementById("show").innerHTML = data.name + ' ' + data.gender;

});

php代码:http://xxx.xxx.xxx/data.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 可以跨域访问

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

?>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值