Ajax是经常使用的一门与Web服务器通讯的技术,目前发送Ajax请求的主要有4种方式:javascript
至于原生的XHR目前工做中已经不多去手写它了,前些年咱们比较经常使用的是jquery的ajax请求,可是近些年前端发展很快,jquery包装的ajax已经失去了往日的光辉,取而代之的是新出现的axios和fetch,二者都开始抢占“请求”这个前端重要领域。本文结合本身的使用经历总结一下它们之间的一些区别,并给出一些本身的理解。css
代码示例:html
$.ajax({
type:"GET",
url:url,
data:data,
dataType:dataType
success:function(){},
error:function(){}
})
以上代码很简单,我就很少解释了,这就是jquery对原生XHR的封装,另外还增长了jsonp的支持,让ajax请求能够支持跨域请求,可是要注意的是:jsonp请求本质不是XHR异步请求,就是请求了一个js文件,所以在浏览器的network面板中的xhr标签下看不到jsonp的跨域请求,可是在js标签下能看见。前端
jsonp请求示例:vue
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>使用jQuery-AJAX--读取得到跨域JSONP数据</title>
<script src="./jquery-1.7.2.js" type="text/javascript"></script>
<style type="text/css">
body,html{font-family: "Microsoft Yahei";}
a{text-decoration: none;}
</style>
</head>
<body>
<h2><a href="javascript:void(0)" class="btnAJAX">点击AJAX获取数据JSONP跨域....</a></h2>
<script src="jquery.min.js"></script>
<script type="text/javascript">
$(function() {
$(".btnAJAX").click(function(){
$.ajax({
type : "get",
async:false,
url : "http://weather.123.duba.net/static/weather_info/101121301.html",
dataType : "jsonp",
jsonp: "", //服务端用于接收callback调用的function名的参数
jsonpCallback:"weather_callback", //callback的function名称
success : function(json){
console.log(json); //浏览器调试的时候用
},
error:function(){
alert('fail');
}
});
});
});
</script>
</body>
</html>
效果以下:java
当点击以上文字时,查看xhr请求,发现并无发出xhr请求node
再查看js请求,发现js发出了一个请求,所以jsonp本质是js请求而并不是xhr 请求,只是$.ajax把jsonp请求封装到了ajax里面而已。react
其实jquery ajax使用起来已是很方便了,那为何如今还会被慢慢抛弃呢?我的认为主要缘由有如下几点:jquery
总结ios
随着前端基于MVVM模式的Vue和React新一代框架的兴起,以及ES6等新规范的制定,像Jquery这种大而全的JS库注定是要走向低潮的。
代码示例:
axios({
method: 'post',
url: '/login',
data: {
username:'martin',
password:'a1234567'
}
})
.then(function (res) {
console.log(res);
})
.catch(function (err) {
console.log(err);
});
这种ajax请求方式是Vue框架的做者尤雨溪开始推荐使用的。其实Axios的本质也是基于原生XHR的封装,只不过它是基于ES6的新语法Promise的实现版本。而且具备如下几条特性:
总结
Axios除了和jquery ajax同样封装了原生的XHR,还提供了不少好比:并发请求、拦截等多种接口,同时它的体积还比较小,也没有下文fetch的各类问题,能够说是目前最佳的ajax请求方式了。
代码示例:
try{
var response=await fetch(url);
var data=response.json();
console.log(data);
}catch(e){
console.log('error is'+e);
}
上面说的$.ajax和Axios说到底本质都是对原生XHR的封装,可是Fetch能够说是新时代XHR的替代品。它的特性以下:
可是目前Fetch还存在不少问题
1)fetch只对网络请求报错,对400,500都当作成功的请求
2)fetch默认不会带cookie,须要添加配置项
3)fetch没有办法原生监测请求的进度,而XHR能够
Fetch在使用上说实话目前尚未axios和jquery ajax方便,所以我我的在工做中也是使用axios的比较多。说到这里,你可能以为Fetch就是强行用ES新规范作出来的代替XHR的半成品,事实上我就是这么认为的。可是有一点Fetch作的性能要远比XHR要好,那就是“跨域的处理”。
由于同源策略的约束,浏览器发送的请求是不能随便跨域的,必定要借助JSONP或者跨域头来协助跨域,而Fetch能够直接设置mode为“no-cors”来实现跨域访问,以下所示
fetch('/login.json', {
method: 'post',
mode: 'cors',
data: {name:martin''}
}).then(function() { /* handle response */ });
咱们会获得一个type为“opaque”(透明)的response。这个请求是真正抵达事后台的,可是浏览器不能够访问返回的内容,这也就是为何response中的type为“opaque”(透明)的缘由。
总结
Fetch仍是一个新时代的半成品,不少地方并不完善,可是也有它的优点所在,总的来讲,就是Fetch技术还须要时间的沉淀,目前尚未达到axios的性能。
若是你是直接拉到底部的,就只要记住这个结论就能够啦,目前只须要熟练使用Axios就能够啦,Jquery的ajax会逐渐被时代淘汰,Fetch虽然符合前端潮流,可是目前还尚不成熟,没有Axios使用起来便利。