Fetch和Axios请求对比

本文详细比较了Axios和Fetch在兼容性、请求方式、超时处理、数据转化、拦截器、并发请求等方面的异同,以及它们在实际开发中的应用场景和优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Fetch和Axios的请求对比

一、根本

Axios: 它是用于网络请求的第三方库,它是一个库;

Fetch: 是es6新增的用于网络请求标准api,它是一个api。

二、兼容性

Axios: 兼容IE浏览器;

Fetch: 在IE浏览器和一些老版本浏览器上没有受到支持,需要借助whatwg-fetch库实现,不过现在很多网站的开发都为了减少成本而选择不再兼容IE浏览器。

**注意:**在比较旧的浏览器上面可能还需要使用promise兼容库。

三、请求方式

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属性中,以字符串的方式进行传递。

四、响应超时

Axios的相应超时设置是非常简单的,直接设置timeout属性就可以了

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

Fetch需使用AbortController属性

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("请求超时"));

五、对数据的转化

Axios会自动对数据进行转化

// 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可以通过一些封装实现Axios的自动转化功能,至于如何实现由于我没有去研究过所以就不再这里多嘴,不过实现起来应该不难,但是要将实现过程写的健壮就需要花费一定的时间,这里就不展开说了。

六、HTTP拦截器

**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);
  });

七、同时请求

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);
  });

Fetch 对浏览器原生支持,即时测试某些接口直接在Chrome浏览器中使用Fetch进行请求,尤其是编写爬虫或脚本的时候,你在当前网页打开Chrome的控制台使用Fetch几乎不需要什么配置就可以直接进行请求。

### Fetch API Axios对比 Fetch API 是一种浏览器内置的标准接口,用于发起网络请求并处理响应。Axios 则是一个基于 Promise 的 HTTP 客户端库,支持浏览器 Node.js 环境下的 HTTP 请求。 #### 1. **基本语法** - 使用 Fetch API 发起 GET 请求时,通常会这样写: ```javascript fetch('http://example.com/api') .then(response => response.json()) .then(data => console.log(data)) .catch(error => console.error('Error:', error)); ``` 这里需要注意的是 `response` 对象需要通过 `.json()` 方法手动解析为 JSON 数据[^1]。 - 使用 Axios 发起相同的 GET 请求则更加简洁直观: ```javascript axios.get('http://example.com/api') .then(response => { console.log(response.data); }) .catch(error => { console.error('Error:', error); }); ``` #### 2. **默认行为** - Fetch 不会自动带上跨域请求中的 cookies 或者认证信息,除非显式设置 `{credentials: 'include'}` 参数[^2]。 - Axios 默认不会发送 cookies 跨域,但如果配置了 `withCredentials: true`,它会在跨域请求中附带 cookies[^3]。 #### 3. **错误处理** - Fetch 只有在网络层面发生异常(如 DNS 解析失败、连接中断等)才会触发 `catch` 块;即使服务器返回了一个状态码为 4xx 或 5xx 的响应,也不会被视作拒绝的 Promise。因此开发者需要额外判断 `response.ok` 属性来确认请求成功与否[^1]。 - Axios 自动将所有的 HTTP 错误视为异常,并进入 `catch` 处理逻辑,简化了开发者的负担[^3]。 #### 4. **取消请求** - Fetch 并不原生支持取消操作,不过可以通过 AbortController 来实现这一功能: ```javascript const controller = new AbortController(); const signal = controller.signal; setTimeout(() => controller.abort(), 5000); fetch('http://example.com/api', {signal}) .then(response => response.json()) .then(data => console.log(data)) .catch(error => console.error('Request aborted or other error:', error)); ``` - Axios 提供了一种更简单的方式来进行请求取消: ```javascript const CancelToken = axios.CancelToken; const source = CancelToken.source(); axios.get('http://example.com/api', { cancelToken: source.token, }).catch(function (thrown) { if (axios.isCancel(thrown)) { console.log('Request canceled', thrown.message); } }); // 取消请求 source.cancel('Operation canceled by the user.'); ``` #### 5. **兼容性可移植性** - Fetch 是现代浏览器的一个标准特性,在大多数主流浏览器中有良好的支持,但在旧版 IE 浏览器中不可用。对于服务端环境(Node.js),需引入 polyfill 才能正常使用。 - Axios 支持更多的运行环境,不仅限于浏览器,还能够在 Node.js 下工作,这使得它成为全栈应用的理想选择之一[^3]。 #### 总结 虽然两者都能很好地完成 HTTP 请求的任务,但它们各有优劣。如果项目已经依赖大量第三方库或者希望减少外部依赖,则可以选择 Fetch API;而当追求更高的易用性以及更好的用户体验(比如简单的错误捕获机制、方便的取消请求方式)时,Axios 显然是更为合适的选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值