Axios和Fetch有什么区别?


Answers:


164

Fetch和Axios在功能上非常相似,但是为了实现向后兼容性,Axios似乎工作得更好(例如,在IE 11中,fetch无法正常工作,请查看此文章

另外,如果您使用JSON请求,则以下是我偶然发现的一些区别。

提取JSON发布请求

let url = 'https://someurl.com';
let options = {
            method: 'POST',
            mode: 'cors',
            headers: {
                'Accept': 'application/json',
                'Content-Type': 'application/json;charset=UTF-8'
            },
            body: JSON.stringify({
                property_one: value_one,
                property_two: value_two
            })
        };
let response = await fetch(url, options);
let responseOK = response && response.ok;
if (responseOK) {
    let data = await response.json();
    // do something with data
}

Axios JSON发布请求

let url = 'https://someurl.com';
let options = {
            method: 'POST',
            url: url,
            headers: {
                'Accept': 'application/json',
                'Content-Type': 'application/json;charset=UTF-8'
            },
            data: {
                property_one: value_one,
                property_two: value_two
            }
        };
let response = await axios(options);
let responseOK = response && response.status === 200 && response.statusText === 'OK';
if (responseOK) {
    let data = await response.data;
    // do something with data
}

所以:

  • 提取主体 = Axios的数据
  • 必须对提取的主体进行字符串化,Axios的数据包含该对象
  • 提取在请求对象中没有URL,Axios 在请求对象中具有URL
  • 提取请求功能包括url作为参数,Axios请求功能不包括url作为参数
  • 取请求是确定当响应对象包含的确定属性,Axios公司请求是确定状态为200状态文本是“OK”
  • 获取json对象的响应:在访存中,调用响应对象上的json()函数,在Axios中获取响应对象的data属性

希望这可以帮助。


这里还有更多问题。一旦responseOk为true,是否需要检查response.data中的状态(如果提供了状态)?谢谢
杨洋

1
Axios request is ok when status is 200 and statusText is 'OK' 那么2xx范围内的其他httpStatus(例如201或204)呢?
leonbloy

46

它们是HTTP请求库...

我最终还是有同样的疑问,但是这篇文章中的表格使我同意isomorphic-fetch。这是fetch但随着工作的NodeJS。

http://andrewhfarmer.com/ajax-libraries/


上面的链接失效了。这张表在这里:https : //www.javascriptstuff.com/ajax-libraries/

或在这里: 在此处输入图片说明


6
仍然无法找到通过axios进行获取的好处。您能知道为什么我应该使用axios吗?
Gorakh Nath

4
我认为fetch是一个标准规范,请参阅fetch.spec.whatwg.org ... axios可能具有更多功能,因为它不遵循该规范....我认为最终它们会做基础(ajax http请求),但这取决于关于您所需要的...我不需要变压器...因此,获取标准库是一个不错的选择……
Lucas Katayama

4
请注意,该表具有误导性。它定义fetch本地这意味着你可以只使用它-无需包括图书馆,因此表中源),而实际上fetch不是在某些平台上实现的(尤其是在IE浏览器的所有版本),而您需要提供无论如何,外部polyfill。
Luca Fagioli

3
除了@ jack123提到的差异外,fetch还没有提供基本的ajax功能,例如timeout(这很奇怪),我们必须使用单独的模块来实现此基本功能。
阿普尔瓦·ja那

2
@LucasKatayama链接似乎已断开
vant-pants

30

根据GitHub上的mzabriskie

总体而言,它们非常相似。axios的一些优点:

  • 变形器:允许在发出请求之前或接收到响应之后对数据执行转换

  • 拦截器:允许您完全更改请求或响应(也包括标题)。另外,在发出请求或Promise解决之前执行异步操作

  • 内置XSRF保护

请检查浏览器支持Axios

在此处输入图片说明

我认为您应该使用axios。


4
同意 Axios的进口量也很小,因此不必担心膨胀-与Express或Mongoose之类的东西相反,如果Express或Mongoose的包装尺寸有些疯狂,他们可能会担心。:)
CodeFinity

1
请不要还原合法的编辑内容,或在没有署名的情况下复制内容。
jonrsharpe

9

提取API和axios API之间的另一大区别

  • 使用Service Worker时,在要拦截HTTP请求时才必须使用访存API。
  • 例如 使用Service Worker在PWA中执行缓存时,如果您使用的是axios API,则将无法进行缓存(仅适用于访存API)

6
谁能证明这是真的?这是1人,但9个upvotes似乎还没有同意这将是很高兴看到这个评论(我用爱可信与服务人员PWA下线就是为什么我问。
汤姆Stickel

当然,我们可以对此发表更多评论,但是使用axios时我遇到了缓存问题,当我用fetch()API替换axios时,它得到了解决
Vaibhav Bacchav

这似乎是正确的,但可能会在不久的将来修复:github.com/axios/axios/pull/2891
arkhz

7

Axios是一个独立的第三方软件包,可以使用NPM轻松安装到React项目中。

您提到的另一个选项是访存功能。与Axios不同,fetch()它内置于大多数现代浏览器中。使用访存,您无需安装第三方软件包。

因此,由您自己决定,fetch()如果您不知道自己在做什么,则可以继续使用,并有可能陷入混乱,或者只是使用Axios,我认为这更简单。


1
提取可以,但是Axios就像您说的那样-更直接。内置于现代浏览器(获取)中的功能对于功能发布而言并不是很好。-所以我更喜欢Axios
汤姆·斯蒂克

5

另外...我在测试中玩各种库,并注意到它们对4xx请求的不同处理。在这种情况下,我的测试将返回一个响应为400的json对象。这是3个流行的lib处理响应的方式:

// request-promise-native
const body = request({ url: url, json: true })
const res = await t.throws(body);
console.log(res.error)


// node-fetch
const body = await fetch(url)
console.log(await body.json())


// Axios
const body = axios.get(url)
const res = await t.throws(body);
console.log(res.response.data)

有趣的是,request-promise-nativeaxiosnode-fetch没有响应时引发4xx响应。还fetch对JSON解析使用了Promise。


1
@baitun这些来自我进行的单元测试(我认为我使用的是Mocha)通常具有.throws测试抛出的错误的方法。在这种情况下,我正在测试来自所有3个库的拒绝,并注意到返回的数据有所不同。
cyberwombat

3

axios的优点:

  • 变形器:允许在发出请求之前或接收到响应之后对数据执行转换
  • 拦截器:允许您完全更改请求或响应(也包括标题)。在发出请求或解决Promise之前也执行异步操作
  • 内置XSRF保护

优势axios超过fetch

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.