ChatGPT解决这个技术问题 Extra ChatGPT

Axios 和 Fetch 有什么区别?

我正在使用 Fetch 调用 Web 服务,但在 Axios 的帮助下我也可以这样做。所以现在我很困惑。我应该选择 Axios 还是 Fetch?

我认为这已在 github.com/mzabriskie/axios/issues/314 中详细讨论过
虽然有很多答案,但我发现没有人提到axiso 的请求超时。

c
c-chavez

Fetch 和 Axios 在功能上非常相似,但为了更好的向后兼容性,Axios 似乎工作得更好(例如,fetch 在 IE 11 中不起作用,请检查 this post

此外,如果您使用 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
}

所以:

Fetch 的 body = Axios 的数据

Fetch 的 body 必须被字符串化,axios 的数据包含对象

Fetch在请求对象中没有url,axios在请求对象中有url

fetch请求函数包含url作为参数,axios请求函数不包含url作为参数。

当响应对象包含 ok 属性时,获取请求是正确的,当状态为 200 且 statusText 为 'OK' 时,Axios 请求是正确的

获取 json 对象响应:在 fetch 中调用响应对象的 json() 函数,在 Axios 中获取响应对象的 data 属性。


这里有更多问题。一旦 responseOk 为真,如果提供了状态,我们是否需要检查 response.data 中的状态?谢谢
Axios request is ok when status is 200 and statusText is 'OK' 2xx 范围内的其他 httpStatus(例如 201 或 204)呢?
或者我认为 response.ok 是一个布尔值,truefalse 值表示响应是否正常。用户离线由 fetch() 拒绝处理,但其他类型的服务器错误由 response.ok 处理
L
Lucas Katayama

它们是 HTTP 请求库...

我最终也有同样的疑问,但这个 post 中的表格让我选择了 isomorphic-fetch。这是 fetch 但适用于 NodeJS。

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

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

https://i.stack.imgur.com/qr24s.png


我仍然无法找到 fetch 优于 axios 的好处。你知道为什么我应该使用 axios 吗?
我认为 fetch 是一个标准,请参阅 fetch.spec.whatwg.org ... axios 可能具有更多功能,因为它没有遵循...。我认为最终他们会做基础知识(ajax http 请求),但这取决于您需要什么...我不需要变压器...所以获得标准库是专业的...
请注意,that table 具有误导性。它将 fetch 定义为 Native意味着您可以直接使用它 - 无需包含库,根据表源),而实际上 fetch 是 { 2}(特别是在所有版本的 IE 中),无论如何您都需要为此提供外部 polyfill。
除了@jack123 fetch 提到的差异之外,还没有提供像 timeout 这样的基本 ajax 功能(这很奇怪),我们必须使用单独的模块来实现这个基本功能。
@LucasKatayama 链接似乎已损坏
d
double-beep

根据 mzabriskie on GitHub

总的来说,它们非常相似。 axios 的一些好处: 转换器:允许在发出请求之前或收到响应之后对数据执行转换 拦截器:允许您完全更改请求或响应(也包括标头)。此外,在发出请求之前或在 Promise 解决之前执行异步操作内置 XSRF 保护

请查看浏览器支持 Axios

https://i.stack.imgur.com/LHV3m.png

我认为你应该使用 axios。


同意。 Axios 也是小型的 enuff 导入,因此膨胀不是太多问题 - 与 express 或 mongoose 之类的东西相反,如果有人对包大小有点疯狂,他们可能会担心。 :)
V
Vaibhav KB

fetch API 和 axios API 之间的另一个主要区别

使用 service worker 时,只有在要拦截 HTTP 请求时才需要使用 fetch API

前任。在使用服务工作者在 PWA 中执行缓存时,如果您使用 axios API,您将无法缓存(它仅适用于 fetch API)


任何人都可以验证这是真的吗?这是 1 个人,但 9 人的支持似乎都同意,但很高兴看到对此的评论(我正在使用 axios 和 service worker pwa 离线这就是我问的原因。
当然,我们可以对此发表更多评论,但我在使用 axios 时遇到了缓存问题,当我用 fetch() API 替换 axios 时,它得到了解决
这似乎是正确的,但可能会在不久的将来修复:github.com/axios/axios/pull/2891
D
Daniel

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

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

所以这取决于您,如果您不知道自己在做什么,您可以使用 fetch() 并且可能会搞砸,或者只使用 Axios,这在我看来更直接。


Fetch 没问题,但是 Axios 就像你说的那样 - 更直接。现代浏览器 (fetch) 中内置的内容对于功能发布来说并不是那么好。 - 所以我更喜欢 Axios
A
ANIL PATEL

Fetch API,需要处理两个promise来获取JSON Object属性中的响应数据。而 axios 生成 JSON 对象。 fetch 中的错误处理也不同,因为它不处理 catch 块中的服务器端错误,即使响应是 HTTP 404 或 500,从 fetch() 返回的 Promise 也不会拒绝 HTTP 错误状态。相反,它将正常解决(ok 状态设置为 false),它只会在网络故障或任何阻止请求完成的情况下拒绝。在 axios 中,您可以在 catch 块中捕获所有错误。

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

Refer this


J
Jairo Malanay

axios的好处:

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

拦截器:允许您完全更改请求或响应(也包括标头)。在发出请求之前或在 Promise 完成之前执行异步操作

内置 XSRF 保护

Advantages of axios over fetch


c
cyberwombat

此外......我在测试中使用了各种库,并注意到它们对 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)

有趣的是 request-promise-nativeaxios 会引发 4xx 响应,而 node-fetch 不会。 fetch 还使用了一个用于 json 解析的承诺。


@baitun 这些来自我运行的单元测试(我想我正在使用 Mocha)通常有一个 .throws 方法来测试抛出的错误。在这种情况下,我正在测试来自 al 3 个库的拒绝情况,并注意到返回的数据存在差异。
A
Amin Gholami

使用 fetch,我们需要处理两个 Promise。使用 axios,我们可以直接访问响应对象数据属性中的 JSON 结果。


c
cdsaenz

我似乎经常做的一项工作是通过 ajax 发送表单,通常包括一个附件和几个输入字段。在更经典的工作流程 (HTML/PHP/JQuery) 中,我在客户端使用了 $.ajax(),在服务器上使用了 PHP,并取得了圆满成功。

我已经将 axios 用于 dart/flutter,但现在我正在学习如何构建我的网站,而 JQuery 没有意义。

问题是 axios 在发布两个普通输入字段并以相同形式上传文件时,另一方面让我对 PHP 感到有些头疼。我在 PHP 中尝试了 $_POSTfile_get_contents("php://input"),使用 FormData 从 axios 发送或使用 json 构造,但我永远无法同时获取文件上传和输入字段。

另一方面,使用 Fetch 我已经成功使用以下代码:

var formid = e.target.id;

// populate FormData
var fd    = buildFormData(formid);       

// post to remote
fetch('apiurl.php', {
  method: 'POST',
  body: fd,
  headers: 
  {
     'Authorization' : 'auth',
     "X-Requested-With" : "XMLHttpRequest"
  }
})    

在 PHP 方面,我可以通过 $_FILES 检索上传并通过 $_POST 处理其他字段数据:

  $posts = [];
  foreach ($_POST as $post) {
      $posts[] =  json_decode($post);
  }

B
Bhupatsinh

Axios 是一个基于 Promise 的 HTTP 客户端库,而 Fetch 是一个用于发出 API 请求的 JavaScript API。

主要区别在于浏览器支持:Axios 支持包括 IE 在内的所有浏览器,而 Fetch 仅受最新浏览器支持,IE 不支持。

参考链接:https://github.com/axios/axios#browser-support

https://caniuse.com/fetch

与 fetch API 相比,Axios 具有更好的错误处理能力。 Axios 可以抛出 400 到 500 范围的状态代码错误,而在 fetch API 中您需要手动处理错误。更多信息:https://bariablogger.in/f/axios-vs-fetch-react