Axios和Fetch有什么区别?

Gor*_*ath 123 ajax xmlhttprequest reactjs es6-promise es6-modules

我通过使用fetch来调用Web服务,但是我可以在axios的帮助下做同样的事情.所以现在我很困惑.我应该选择axios还是获取?

c-c*_*vez 100

Fetch和Axios在功能上非常相似,但为了更加向后兼容,Axios似乎效果更好(例如,获取在IE 11中不起作用,请查看此帖子)

此外,如果您使用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
}
Run Code Online (Sandbox Code Playgroud)

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
}
Run Code Online (Sandbox Code Playgroud)

所以:

  • 获取body = Axios的数据
  • Fetch的主体必须被字符串化,Axios的数据包含该对象
  • Fetch 在请求对象中没有url,Axios 在请求对象中有url
  • 获取请求函数包括url作为参数,Axios请求函数不包含url作为参数.
  • 当响应对象包含ok属性时,获取请求正常,当状态为200statusText为"OK"时,Axios请求正常
  • 要获取json对象响应:在fetch中调用响应对象上的json()函数,在Axios中获取响应对象的data属性.

希望这可以帮助.

  • `当状态为 200 并且 statusText 为“OK”时,Axios 请求正常”` 2xx 范围内的其他 httpStatus(如 201 或 204)怎么样? (5认同)

Luc*_*ama 33

它们是HTTP请求库......

我最后也遇到了同样的疑问,但这篇文章中的表让我顺其自然isomorphic-fetch.哪个fetch适用于NodeJS.

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

  • 我仍然无法找到超过axios的优势.你能知道我为什么要选择axios吗? (4认同)
  • 我认为fetch是一个标准,请参阅https://fetch.spec.whatwg.org/ ... axios可能有更多功能,因为它不遵循那个....我认为最终他们做了基础知识(ajax http请求)但这取决于你需要什么...我不需要变压器...所以获得一个标准的lib是一个专业... (4认同)
  • 请注意[那张表](http://andrewhfarmer.com/ajax-libraries/)会产生误导.它将`fetch`定义为**Native**(_Meaning你可以使用它 - 不需要包含一个库_,相应于表源),而实际上`fetch`是[在某些平台中没有实现](http:/ /caniuse.com/#feat=fetch)(特别是在所有版本的IE中),无论如何都需要提供外部polyfill. (2认同)
  • 添加@ jack123提到的差异fetch也没有提供像'timeout`这样的基本ajax功能(这很奇怪)我们必须使用一个单独的模块来实现这个基本功能. (2认同)
  • @LucasKatayama链接似乎已断开 (2认同)

Thi*_*ath 25

根据GitHub上的mzabriskie的说法 :

总的来说它们非常相似.axios的一些好处:

  • 变形金刚:允许在发出请求之前或收到响应之后对数据进行变换

  • 拦截器:允许您完全改变请求或响应(标题也是如此).此外,在发出请求之前或在Promise结算之前执行异步操作

  • 内置XSRF保护

我认为你应该使用axios.

  • 同意 Axios的进口量也很小,因此不必太肿-与快递或猫鼬之类的东西相反,如果快递或猫鼬对包裹的尺寸有些疯狂,他们可能会担心。:) (3认同)

ANI*_*TEL 13

    \n
  1. Fetch API,需要处理两个 Promise 来获取 JSON 对象属性中的响应数据。而 axios 结果为 JSON 对象。

    \n
  2. \n
  3. fetch 中的错误处理也不同,因为它不处理 catch 块中的服务器端错误,从 fetch() 返回的 Promise 不会拒绝 HTTP 错误状态,即使响应是 HTTP 404 或 500相反,它会正常解析(将 ok 状态设置为 false),并且仅在网络故障或任何阻止请求完成的情况下才会拒绝。在 axios 中,您可以捕获 catch 块中的所有错误。

    \n
  4. \n
\n

我想说使用 axios 更好,可以直接处理拦截器、标头配置、设置 cookie 和错误处理。

\n

参考这个

\n


小智 9

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

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

  • 谁能证实这是真的吗?这是 1 人,但 9 个赞成票似乎同意,但很高兴看到对此的评论(我问的原因是我正在使用 axios 和 Service Worker pwa 离线。 (7认同)
  • 这似乎是正确的,但可能会在不久的将来修复:https://github.com/axios/axios/pull/2891 (2认同)

Jai*_*nay 6

axios 的好处:

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

优势axios超过fetch


Dan*_*iel 6

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

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

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

  • Fetch 还可以,但是 Axios 就像你说的那样——更直接。现代浏览器中内置的内容(获取)对于功能发布来说并不是那么好。- 所以我更喜欢Axios (2认同)

cyb*_*bat 5

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

// 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)
Run Code Online (Sandbox Code Playgroud)

有趣的是,request-promise-nativeaxios抛出 4xx 响应而node-fetch没有。还fetch使用承诺进行 json 解析。