当前位置: 首页 > news >正文

axios 和 fetch异同点

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


相同点

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

不同点

特性fetchaxios
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
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
axios.get('https://api.example.com/data')
    .then(response => console.log(response.data))
    .catch(error => console.error('Error:', error));

2. POST 请求

使用 fetch
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
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
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
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
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
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
// 请求拦截器
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

相关文章:

  • 用户登出、修改密码或重置密码后,token的删除(flask)
  • 【AI News | 20250317】每日AI进展
  • ai本地化 部署常用Ollama软件
  • 【算法百题】专题六_模拟
  • 为什么需要强化学习?它解决了什么问题?
  • SwanLab邮件通知插件:训练完成收到邮件,掌握训练进度更及时
  • SQL Server性能优化实战
  • 人工智能实现电脑任务自动化的开源软件
  • 矩阵的逆的实际意义及牛顿法中的作用
  • debian11安装MongoDB
  • 【Agent】OpenManus-Flow-PlanningFlow设计分析
  • AI开发新纪元:MGX多智能体协作平台深度解析
  • 推理大模型的后训练增强技术-从系统1到系统2:大语言模型推理能力的综述
  • 牛客周赛85 DEF Java
  • 深度学习【迭代梯度下降法求解线性回归】
  • 在 macOS Sequoia 15.2 中启用「三指拖动」并实现快速复制的完整指南 ✨
  • 深度学习-简介
  • 学生选课管理系统数据库设计报告
  • Git下载安装(保姆教程)
  • torcharrow gflags版本问题
  • 巴基斯坦信德省首府卡拉奇发生爆炸
  • 西安碑林博物馆票价将调至85元,工作人员:10元属于改扩建期间惠民票
  • 习近平《在庆祝中华全国总工会成立100周年暨全国劳动模范和先进工作者表彰大会上的讲话》单行本出版
  • 福特汽车撤回业绩指引,警告关税或造成15亿美元利润损失
  • 1101名优秀运动员拟保送,全红婵、黄雨婷、盛李豪在列
  • 虚构医药服务项目、协助冒名就医等,北京4家医疗机构被处罚