越来越火的网络请求Fetch和Axios到底有什么区别

2022-12-16 0 758

在这两天由于撰写JAVA等一连串其原因,无人知晓是不是的忽然辨认出那时许多非主流的中文网站已经大批已经开始采用Fetch展开互联网允诺,觉得再不自学Fetch要是Out了,因此我花了许多天数专门针对去科学研究了呵呵有关Fetch的有关科学知识,辨认出Fetch被探讨的并不多,许多都是一年前即使一年前的该文,绝大多数该文最终得出结论来的推论基本上都是Axios比Fetch好用。

历史事实的确这般,就我对个人的新体验来说,Axios采用新体验的确强于Fetch,因此为何目前在许多大公司的中文网站下面都已经开始采用Fetch展开互联网允诺,带着这个疑点,我又去搜寻了许多数据资料,与此同时又另行将反之亦然的允诺采用Axios和Fetch展开试著,最终得出结论一个推论:Fetch的竞争优势实际上是应用程序原生植物全力支持。

对的,只不过Fetch较之Axios来说基本上没有任何人竞争优势(除应用程序原生植物全力支持),Axios方方面面都比Fetch好用,Fetch要想与此同时实现Axios的许多机能还须要全自动展开PCB。

我撷取了两个较为大的中文网站的允诺图:

提前布局:

越来越火的网络请求Fetch和Axios到底有什么区别

YouTube:

越来越火的网络请求Fetch和Axios到底有什么区别

chan:

越来越火的网络请求Fetch和Axios到底有什么区别

t的PCB。

它最小的不同之处是Fetch是应用程序原生植物全力支持,而Axios须要导入Axios库。

1. 火爆某种程度

尽管难以展开简单的较为,但我们可以从npm包用户数上看:

越来越火的网络请求Fetch和Axios到底有什么区别

因为Node环境下默认是不全力支持Fetch的,因此必须要采用node-fetch这个包,而这个包的周用户数一路攀升,可以看到已经来到了每周2千多万的用户数。这还实际上是Node环境下,应用程序则是默认全力支持不须要第三方包。

越来越火的网络请求Fetch和Axios到底有什么区别

下面是Axios的下载量,可以看到也是一路攀升,AxiosPCB的各种方法的确非常的好用。

本篇该文着重会从下面几项内容展开较为:

兼容性基本语法响应超时对数据的转化HTTP拦截器与此同时允诺

2. 兼容性问题

Axios可以兼容IE浏览器,而Fetch在IE应用程序和许多老版本应用程序上没有受到全力支持,但有一个库可以让老版本应用程序全力支持Fetch即它就是whatwg-fetch,它可以让你在老版本的应用程序中也可以采用Fetch,并且那时许多中文网站的开发都为了减少成本而选择不再兼容IE应用程序。

注意:在较为旧的应用程序下面可能还须要采用promise兼容库。

各个应用程序对Fetch的兼容:

越来越火的网络请求Fetch和Axios到底有什么区别

3. 允诺方式

下面我们上看呵呵如何采用Axios和Fetch展开允诺。

Axios:

const options = { url: “http://example.com/”, method: “POST”, headers: { Accept: “application/json”, “Content-Type”: “application/json;charset=UTF-8”, }, data: { a: 10, b: 20, }, }; axios(options).then((response) => { console.log(response.status); });

Fetch:

const url = “http://example.com/”; const options = { method: “POST”, headers: { Accept: “application/json”, “Content-Type”: “application/json;charset=UTF-8”, }, body: JSON.stringify({ a: 10, b: 20, }), }; fetch(url, options).then((response) => { console.log(response.status); });

其中最小的不同之处是传递数据的方式不同,Axios是放到data属性里,以对象的方式展开传递,而Fetch则是须要放在body属性中,以字符串的方式展开传递。

4. 响应超时

Axios的相应超时设置是非常简单的,直接设置timeout属性就可以了,而Fetch设置起来就远比Axios麻烦,这也是许多人更喜欢Axios而不太喜欢Fetch的其原因之一。

axios({ method: “post”, url: “http://example.com/”, timeout: 4000, // 允诺4秒无响应则会超时 data: { firstName: “David”, lastName: “Pollock”, }, }) .then((response) => { /* 处理响应 */ }) .catch((error) => console.error(“允诺超时”));

Fetch提供了AbortController属性,但采用起来不像Axios因此简单。

const controller = new AbortController(); const options = { method: “POST”, signal: controller.signal, body: JSON.stringify({ firstName: “David”, lastName: “Pollock”, }), }; const promise = fetch(“http://example.com/”, options); // 如果4秒钟没有响应则超时 const timeoutId = setTimeout(() => controller.abort(), 4000); promise .then((response) => { /* 处理响应 */ }) .catch((error) => console.error(“允诺超时”));

5. 对数据的转化

Axios还有非常好的一点就是会自动对数据展开转化,而Fetch则不同,它需要采用者展开全自动转化。

// axios axios.get(“http://example.com/”).then( (response) => { console.log(response.data); }, (error) => { console.log(error); } ); // fetch fetch(“http://example.com/”) .then((response) => response.json()) // 须要对响应数据展开转换 .then((data) => { console.log(data); }) .catch((error) => console.error(error));

Fetch提供的转化API有下面几种:

arrayBuffer()blob()json()text()formData()

采用Fetch时你须要清楚允诺后的数据类型是什么,然后再用对应的方法将它展开转换。

Fetch可以通过许多PCB与此同时实现Axios的自动转化机能,至于如何与此同时实现由于我没有去科学研究过因此就不再这里多嘴,不过与此同时实现起来应该不难,但要将与此同时实现过程写的健壮就须要花费一定的天数。

6. HTTP拦截器

Axios的一大卖点就是它提供了拦截器,可以统一对允诺或响应展开许多处理,相信如果看过一个较为完整的项目的允诺PCB的话,一定对Axios的拦截器有一定的了解,它是一个非常重要的机能。

采用它可以为允诺附加token、为允诺增加天数戳防止允诺缓存,以及拦截响应,一旦状态码不符合预期则直接将响应消息通过弹框的形式展示在界面上,比如密码错误、服务器内部错误、表单验证不通过等问题。

axios.interceptors.request.use((config) => { // 在允诺之前对允诺参数展开处理 return config; }); // 发送GET允诺 axios.get(“http://example.com/”).then((response) => { console.log(response.data); });

而Fetch没有拦截器机能,但要与此同时实现该机能并不难,直接重写全局Fetch方法就可以办到。

fetch = ((originalFetch) => { return (…arguments) => { const result = originalFetch.apply(this, arguments); return result.then(console.log(“允诺已发送”)); }; })(fetch); fetch(“http://example.com/”) .then((response) => response.json()) .then((data) => { console.log(data); });

7. 与此同时允诺

与此同时允诺在项目中用的不多,但偶尔可能会用到。

Axios:

axios .all([ axios.get(“https://api.github.com/users/iliakan”), axios.get(“https://api.github.com/users/taylorotwell”), ]) .then( axios.spread((obj1, obj2) => { }) );

Fetch:

Promise.all([ fetch(“https://api.github.com/users/iliakan”), fetch(“https://api.github.com/users/taylorotwell”), ]) .then(async ([res1, res2]) => { const a = await res1.json(); const b = await res2.json(); }) .catch((error) => { console.log(error); });

8. 应用程序原生植物全力支持

Fetch唯一碾压Axios的一点就是现代应用程序的原生植物全力支持。

本着负责的态度(只不过是因为这篇该文写得较为困难…因为我对Fetch的科学研究不深)在这两天,我多次试著采用Fetch,习惯后觉得还挺好用的,最主要是应用程序原生植物就全力支持,不像Axios须要导入一个包,而且须要即时测试某些接口直接在Chrome应用程序中采用Fetch展开允诺,尤其是撰写爬虫或JAVA的时候,你在当前网页打开Chrome的控制台采用Fetch基本上不须要什么配置就可以直接展开允诺。

越来越火的网络请求Fetch和Axios到底有什么区别

上图是在chan打开Chrome控制台然后调用chan对个人数据API,可以看到能够成功的拿到数据。

9. 最终

Fetch可以与此同时实现所有Axios能够与此同时实现的机能,但须要另行展开PCB,如果不喜欢折腾直接在项目中采用Axios是一个非常明智的选择,这完全取决于你是否愿意采用应用程序内置API。

有时候新技术逐渐取代老技术是一个必然趋势,因此Fetch有一天终将会取代XMLHttpRequest,也许之后Axios库会改为采用Fetch允诺。

参考该文:Axios or fetch(): Which should you use?

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务