axios 和 fetch异同点

axios 和 fetch 都是用于在浏览器和 Node.js 中发起 HTTP 请求的工具,但它们有一些关键区别。以下是它们的异同点,并通过示例说明如何使用它们。


相同点

  1. 用途:都用于发起 HTTP 请求(如 GET、POST 等)。
  2. 支持 Promise:都基于 Promise,支持异步操作。
  3. 跨平台 :都可以在浏览器和 Node.js 中使用(fetch 在 Node.js 中需要额外的 polyfill,如 node-fetch)。
  4. 支持现代浏览器:两者在现代浏览器中都能使用。

不同点

特性 fetch axios
API 设计 原生 API,较为底层,需要手动处理一些细节(如 JSON 解析、错误处理)。 封装更高级,API 设计更友好,功能更丰富。
错误处理 只有网络错误才会 reject,HTTP 错误(如 404、500)需要手动处理。 HTTP 错误(如 404、500)会自动 reject。
请求取消 需要使用 AbortController。 内置支持请求取消,使用 CancelToken(旧版)或 AbortController(新版)。
拦截器 不支持。 支持请求和响应拦截器。
自动 JSON 转换 需要手动调用 .json() 方法。 自动将响应数据转换为 JSON。
请求进度 不支持。 支持上传和下载进度监控。
浏览器兼容性 现代浏览器支持良好,IE 不支持。 兼容性更好,支持更广泛的浏览器(包括 IE)。
体积 原生 API,无需额外安装。 需要安装,体积较大(约 13KB)。

示例对比

1. GET 请求

使用 fetch
javascript 复制代码
fetch('https://api.example.com/data')
    .then(response => {
        if (!response.ok) {
            throw new Error('Network response was not ok');
        }
        return response.json(); // 手动解析 JSON
    })
    .then(data => console.log(data))
    .catch(error => console.error('Error:', error));
使用 axios
javascript 复制代码
axios.get('https://api.example.com/data')
    .then(response => console.log(response.data))
    .catch(error => console.error('Error:', error));

2. POST 请求

使用 fetch
javascript 复制代码
fetch('https://api.example.com/data', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
    },
    body: JSON.stringify({ name: 'John', age: 30 }), // 手动序列化
})
    .then(response => response.json())
    .then(data => console.log(data))
    .catch(error => console.error('Error:', error));
使用 axios
javascript 复制代码
axios.post('https://api.example.com/data', { name: 'John', age: 30 })
    .then(response => console.log(response.data))
    .catch(error => console.error('Error:', error));

3. 错误处理

使用 fetch
javascript 复制代码
fetch('https://api.example.com/invalid-endpoint')
    .then(response => {
        if (!response.ok) {
            throw new Error(`HTTP error! status: ${response.status}`);
        }
        return response.json();
    })
    .then(data => console.log(data))
    .catch(error => console.error('Error:', error));
使用 axios
javascript 复制代码
axios.get('https://api.example.com/invalid-endpoint')
    .then(response => console.log(response.data))
    .catch(error => {
        if (error.response) {
            console.error('HTTP error! status:', error.response.status);
        } else {
            console.error('Error:', error.message);
        }
    });

4. 请求取消

使用 fetch
javascript 复制代码
const controller = new AbortController();
const signal = controller.signal;

fetch('https://api.example.com/data', { signal })
    .then(response => response.json())
    .then(data => console.log(data))
    .catch(error => console.error('Error:', error));

// 取消请求
controller.abort();
使用 axios
javascript 复制代码
const controller = new AbortController();

axios.get('https://api.example.com/data', { signal: controller.signal })
    .then(response => console.log(response.data))
    .catch(error => console.error('Error:', error));

// 取消请求
controller.abort();

5. 拦截器

使用 fetch

fetch 不支持拦截器,需要手动封装。

使用 axios
javascript 复制代码
// 请求拦截器
axios.interceptors.request.use(config => {
    console.log('Request sent:', config);
    return config;
});

// 响应拦截器
axios.interceptors.response.use(response => {
    console.log('Response received:', response);
    return response;
});

axios.get('https://api.example.com/data')
    .then(response => console.log(response.data))
    .catch(error => console.error('Error:', error));

总结

  • fetch:

    • 原生 API,无需额外依赖。
    • 更底层,需要手动处理 JSON 解析、错误处理等。
    • 适合简单的请求场景,或对包体积敏感的项目。
  • axios:

    • 功能更强大,API 更友好。
    • 支持拦截器、自动 JSON 转换、请求取消等高级功能。
    • 适合需要复杂功能(如拦截器、进度监控)的项目。

根据项目需求选择合适的技术:

  • 如果是现代浏览器环境且需要轻量级解决方案,可以选择 fetch。
  • 如果需要更强大的功能和更好的兼容性,可以选择 axios。
相关推荐
deli0071 分钟前
连接池到底配多大?QPS 和 RT 算一遍,再跑 1 万次请求实测超时率
前端
风花一世月21 分钟前
🏮 我把三坊七巷做成了能飞的 3D 地图(901 个真实建筑轮廓、20 处景点,在线直接玩)
前端
特立独行的猫A24 分钟前
用仓颉语言写一个串口调试助手:cj-tauri 实战
前端
小凯在掘金24 分钟前
Shadow DOM 和 Virtual DOM ?别再傻傻分不清
前端·html
郑州光合科技余经理24 分钟前
本地生活平台搭建:跨业态用户标识怎么贯通
java·开发语言·前端·后端·uni-app·php·ai编程
数据掘金25 分钟前
埋点事件命名升级时老数据怎么办
前端
对空六课26 分钟前
Vue 组件曝光埋点为什么会重复触发?去重方案与实现思路
服务器·前端·算法·数据分析
isha29 分钟前
Univer拆解——从类与方法的视角分析
前端·javascript
羲云29 分钟前
不想再让用户手写 Markdown:零依赖的所见即所得编辑器最新版发布 V0.2.0
前端
deli00731 分钟前
限流算法到底怎么选?令牌桶 vs 漏桶 vs 滑动窗口 3 种同屏实测
前端