当前位置: 首页 > news >正文

$.ajax,axios,fetch三种ajax请求的区别

Ajax是常用的一门与Web服务器通信的技术,目前发送Ajax请求的主要有4种方式:

  • 原生XHR
  • jquery中的$.ajax()
  • axios
  • fetch

原生的XHR目前工作中已经很少去手写它了,前些年我们比较常用的是jquery的ajax请求,但是近些年前端发展很快,jquery包装的ajax已经失去了往日的光辉,取而代之的是新出现的axios和fetch,两者都开始抢占“请求”这个前端重要领域。

1.Jquery ajax

代码示例:

$.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请求示例:

<!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>


当点击以上文字时,查看xhr请求,发现并没有发出xhr请求
在这里插入图片描述
再查看js请求,发现js发出了一个请求,因此jsonp本质是js请求而并非xhr 请求,只是$.ajax把jsonp请求封装到了ajax里面而已。

其实jquery ajax使用起来已经是很方便了,那为什么现在还会被慢慢抛弃呢?个人认为主要原因有以下几点:

  • 要使用jquery ajax必须引入jquery整个大文件,不是很划算
  • jquery ajax本身是针对MVC设计模式的编程,与当前流行的基于MVVM模式的vue、react等框架不符合
  • jquery ajax本质是基于XHR的封装,而XHR本身架构不是很清晰,目前已采用fetch代替方案

总结
随着前端基于MVVM模式的Vue和React新一代框架的兴起,以及ES6等新规范的制定,像Jquery这种大而全的JS库注定是要走向低潮的。

2.Axios

代码示例:

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的实现版本。并且具有以下几条特性:

  • 从浏览器中创建XHR
  • 从node.js中创建http请求
  • 支持promise API
  • 提供了并发请求的接口(重要,方便操作)
  • 支持拦截请求和响应
  • 支持取消请求
  • 客户端支持防御CSRF攻击

总结
Axios除了和jquery ajax一样封装了原生的XHR,还提供了很多比如:并发请求、拦截等多种接口,同时它的体积还比较小,也没有下文fetch的各种问题,可以说是目前最佳的ajax请求方式了。

3.Fetch

代码示例:

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的替代品。它的特性如下:

  • 更加底层,提供更丰富的API
  • 不基于XHR,是ES新规范的实现方式

但是目前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的性能。

4 总结

Jquery的ajax会逐渐被时代淘汰,Fetch虽然符合前端潮流,但是目前还尚不成熟,没有Axios使用起来便利

相关文章:

  • QA团队和测试团队的关系
  • CI/CD是什么?如何理解持续集成、持续交付和持续部署
  • el-pagination样式美化
  • js高效修改对象数组里的对象属性名
  • vue+element树组件 实现树懒加载的过程详解
  • JS 异步编程六种方案
  • el-table样式美化
  • JavaScript模块化编程文章集锦
  • 《“ 追梦人” 的逐梦路:探寻大学生创客群体的发展之道》
  • Python Web开发 # Flask框架教程
  • 项目上线流程
  • 刻意练习
  • 【成长经历】【钉钉前端】 高中毕业-如何用 15 年从小白到技术专家
  • 转正实习、春招、秋招、校招、社招的4个区别和陷阱
  • 前端工具方法
  • [deviceone开发]-do_Webview的基本示例
  • bootstrap创建登录注册页面
  • JavaScript学习总结——原型
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • python_bomb----数据类型总结
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • SQLServer插入数据
  • 创建一种深思熟虑的文化
  • 欢迎参加第二届中国游戏开发者大会
  • 警报:线上事故之CountDownLatch的威力
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 离散点最小(凸)包围边界查找
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 浏览器缓存机制分析
  • 使用 QuickBI 搭建酷炫可视化分析
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • gunicorn工作原理
  • $.ajax()
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (27)4.8 习题课
  • (第61天)多租户架构(CDB/PDB)
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .Net CoreRabbitMQ消息存储可靠机制
  • .NET 中让 Task 支持带超时的异步等待
  • .NET和.COM和.CN域名区别
  • .NET连接数据库方式
  • .net流程开发平台的一些难点(1)
  • .Net中wcf服务生成及调用
  • [ 转载 ] SharePoint 资料
  • []我的函数库
  • [2018][note]用于超快偏振开关和动态光束分裂的all-optical有源THz超表——
  • [AIGC] 如何建立和优化你的工作流?
  • [APIO2015]巴厘岛的雕塑
  • [asp.net core]project.json(2)
  • [C#] 如何调用Python脚本程序
  • [C++] Boost智能指针——boost::scoped_ptr(使用及原理分析)