news 2026/3/24 9:07:55

企业级Axios封装实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
企业级Axios封装实战指南

以下是一套企业级 Axios 封装方案,包含请求 / 响应拦截、统一错误处理、请求取消、环境区分、请求重试等核心功能,可直接集成到 Vue/React/ 纯前端项目中:

一、封装目录结构

src/ ├── utils/ │ ├── request.js # Axios 核心封装 │ └── cancelToken.js # 请求取消工具(可选) ├── config/ │ └── env.js # 环境配置(区分开发/测试/生产) └── api/ # 接口管理(按业务拆分) ├── user.js # 用户相关接口 └── order.js # 订单相关接口

二、第一步:环境配置(config/env.js)

区分不同环境的接口基础地址,避免硬编码:

// 环境判断(基于 Vite/Webpack 环境变量) const env = import.meta.env.MODE || 'development'; // 环境配置 const envConfig = { development: { baseURL: 'http://10.230.2.24:8083', // 开发环境 }, test: { baseURL: 'http://1.95.205.197:8083', // 测试环境 }, production: { baseURL: 'https://magicpower.sh-liangxin.com/cloud-api', // 生产环境 }, }; export default { env, ...envConfig[env], };

三、第二步:Axios 核心封装(utils/request.js)

import axios from 'axios'; import envConfig from '@/config/env'; import { ElMessage, ElMessageBox } from 'element-plus'; // 按需替换为你的UI库 import { getToken, clearToken, redirectLogin } from '@/utils/auth'; // 自定义token工具 // 创建Axios实例 const service = axios.create({ baseURL: envConfig.baseURL, // 基础地址 timeout: 10000, // 超时时间(10秒) headers: { 'Content-Type': 'application/json;charset=utf-8', }, }); // ===================== 请求拦截器 ===================== service.interceptors.request.use( (config) => { // 1. 添加token(登录态) const token = getToken(); // 从localStorage/cookie获取token if (token) { config.headers.Authorization = `Bearer ${token}`; } // 2. GET请求参数序列化(可选) if (config.method === 'get' && config.params) { // 解决GET请求参数中数组/对象的序列化问题 config.paramsSerializer = { serialize: (params) => { return new URLSearchParams(params).toString(); }, }; } // 3. 自定义请求头(如接口版本号) config.headers['X-API-Version'] = 'v1'; return config; }, (error) => { // 请求前的错误(如参数错误) console.error('请求拦截器错误:', error); return Promise.reject(error); } ); // ===================== 响应拦截器 ===================== service.interceptors.response.use( (response) => { const res = response.data; // 1. 接口自定义状态码处理(根据后端约定调整) const code = res.code || res.status; // 成功状态码(示例:200/0表示成功) if (code === 200 || code === 0) { return res; } // 2. 业务错误处理(如参数错误、权限不足) ElMessage.error(res.msg || '接口请求失败'); return Promise.reject(res); }, (error) => { // 网络/HTTP错误处理 const { response, message } = error; // 1. 取消请求的错误(不提示) if (axios.isCancel(error)) { console.log('请求已取消:', message); return Promise.reject(error); } // 2. 超时错误 if (message.includes('timeout')) { ElMessage.error('请求超时,请稍后重试'); return Promise.reject(error); } // 3. 无响应(网络错误) if (!response) { ElMessage.error('网络异常,请检查网络连接'); return Promise.reject(error); } // 4. HTTP状态码处理 const status = response.status; switch (status) { case 401: // 未授权/Token过期 ElMessageBox.confirm( '登录状态已过期,请重新登录', '提示', { confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning', } ).then(() => { clearToken(); // 清除token redirectLogin(); // 跳登录页 }); break; case 403: // 权限拒绝 ElMessage.error('暂无权限访问该资源'); break; case 404: // 接口不存在 ElMessage.error('请求地址不存在'); break; case 500: // 服务器错误 ElMessage.error('服务器内部错误,请稍后重试'); break; default: ElMessage.error(`请求失败:${status} - ${response.data?.msg || '未知错误'}`); } return Promise.reject(error); } ); // ===================== 请求重试(可选) ===================== // 适用于网络抖动导致的偶发失败,需安装 axios-retry // import axiosRetry from 'axios-retry'; // axiosRetry(service, { // retries: 3, // 重试次数 // retryDelay: (retryCount) => { // return retryCount * 1000; // 每次重试间隔1秒 // }, // retryCondition: (error) => { // // 仅对5xx错误/网络错误重试 // return error.response?.status >= 500 || !error.response; // }, // }); // ===================== 导出核心方法 ===================== // 封装常用请求方法,简化调用 const request = { get: (url, params = {}, config = {}) => { return service.get(url, { params, ...config }); }, post: (url, data = {}, config = {}) => { return service.post(url, data, config); }, put: (url, data = {}, config = {}) => { return service.put(url, data, config); }, delete: (url, params = {}, config = {}) => { return service.delete(url, { params, ...config }); }, // 上传文件(FormData) upload: (url, formData, config = {}) => { return service.post(url, formData, { headers: { 'Content-Type': 'multipart/form-data' }, ...config, }); }, }; // 导出Axios实例(用于特殊场景)和封装方法 export default request; export { service };

四、第三步:请求取消工具(utils/cancelToken.js)

用于防抖场景(如搜索框、快速点击),避免重复请求:

import axios from 'axios'; // 存储取消请求的函数 const cancelRequestMap = new Map(); /** * 取消重复请求 * @param {string} url - 请求地址 * @param {string} msg - 取消提示 */ export const cancelRepeatRequest = (url, msg = '重复请求已取消') => { if (cancelRequestMap.has(url)) { const cancel = cancelRequestMap.get(url); cancel(msg); cancelRequestMap.delete(url); } }; /** * 获取取消令牌配置 * @param {string} url - 请求地址 * @returns {object} 取消令牌配置 */ export const getCancelTokenConfig = (url) => { // 先取消已存在的请求 cancelRepeatRequest(url); return { cancelToken: new axios.CancelToken((cancel) => { cancelRequestMap.set(url, cancel); }), }; }; /** * 清空所有取消请求 */ export const clearAllCancelRequest = () => { for (const cancel of cancelRequestMap.values()) { cancel('页面销毁,取消所有请求'); } cancelRequestMap.clear(); };

五、第四步:接口管理(api/user.js)

按业务模块拆分接口,统一管理,便于维护:

import request from '@/utils/request'; import { getCancelTokenConfig } from '@/utils/cancelToken'; // 用户登录 export const login = (data) => { return request.post('/user/login', data); }; // 获取用户信息 export const getUserInfo = () => { return request.get('/user/info'); }; // 搜索用户(带取消请求,防抖) export const searchUser = (keyword) => { const url = '/user/search'; return request.get(url, { keyword }, getCancelTokenConfig(url)); }; // 上传用户头像 export const uploadAvatar = (formData) => { return request.upload('/user/avatar', formData); }; // 修改用户信息 export const updateUser = (id, data) => { return request.put(`/user/${id}`, data); }; // 删除用户 export const deleteUser = (id) => { return request.delete('/user', { id }); };

六、使用示例(Vue 组件中)

<script setup lang="ts"> import { ref, onUnmounted } from 'vue'; import { login, searchUser } from '@/api/user'; import { clearAllCancelRequest } from '@/utils/cancelToken'; const loading = ref(false); // 登录示例 const handleLogin = async () => { loading.value = true; try { const res = await login({ username: 'admin', password: '123456', }); console.log('登录成功:', res); // 存储token、跳首页等逻辑 } catch (err) { console.error('登录失败:', err); } finally { loading.value = false; } }; // 搜索用户(防抖) const handleSearch = async (keyword) => { try { const res = await searchUser(keyword); console.log('搜索结果:', res); } catch (err) { if (!axios.isCancel(err)) { console.error('搜索失败:', err); } } }; // 页面销毁时清空所有取消请求 onUnmounted(() => { clearAllCancelRequest(); }); </script> <template> <el-button @click="handleLogin" :loading="loading">登录</el-button> <el-input placeholder="输入用户名搜索" @input="handleSearch" clearable /> </template>

七、核心特性说明

特性说明
环境区分自动适配开发 / 测试 / 生产环境的接口地址,无需手动修改
请求拦截统一添加 token、自定义请求头,处理 GET 参数序列化
响应拦截统一处理业务状态码、HTTP 状态码,全局错误提示
错误分类处理区分取消请求、超时、网络错误、401/403/500 等场景,针对性提示
请求取消解决重复请求问题(如搜索框防抖、快速点击)
方法封装简化 get/post/put/delete/upload 调用,参数更清晰
可扩展支持请求重试、FormData 上传、自定义配置等高级功能

八、适配调整建议

  1. UI 库替换:若不用 Element Plus,将ElMessage/ElMessageBox替换为你的 UI 库(如 Ant Design Vue 的message/modal);
  2. 状态码调整:根据后端实际约定的成功 / 失败状态码修改响应拦截器中的code判断逻辑;
  3. Token 存储getToken/clearToken需实现自己的 token 存储逻辑(如 localStorage/cookie);
  4. 请求重试:如需开启,安装axios-retry并取消注释对应代码;
  5. TypeScript 适配:可给 request 方法添加 TS 类型定义,提升类型提示。

这套封装兼顾了易用性和健壮性,符合企业级项目的开发规范,可直接复用或根据业务需求微调。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/13 5:11:01

YOLOv8训练参数详解:epochs、imgsz、data配置说明

YOLOv8训练参数详解&#xff1a;epochs、imgsz、data配置说明 在目标检测的实际项目中&#xff0c;我们常常面临这样的困境&#xff1a;模型训练了上百轮却依然漏检严重&#xff0c;或者推理速度慢得无法部署到边缘设备。问题的根源往往不在于算法本身&#xff0c;而在于那些看…

作者头像 李华
网站建设 2026/3/18 12:07:31

YOLOv8 SPPF模块作用机制详解

YOLOv8中的SPPF模块&#xff1a;轻量高效的空间上下文增强机制 在目标检测领域&#xff0c;速度与精度的平衡始终是工程实践的核心挑战。尤其是在无人机航拍、智能监控和移动端视觉应用中&#xff0c;模型不仅要准确识别尺度差异极大的物体——从远处的小行人到近处的大车辆——…

作者头像 李华
网站建设 2026/3/24 3:05:14

YOLOv8如何替换主干网络?自定义Backbone教程

YOLOv8如何替换主干网络&#xff1f;自定义Backbone教程 在目标检测的实际落地过程中&#xff0c;我们常常会遇到这样的问题&#xff1a;标准模型虽然在COCO等通用数据集上表现优异&#xff0c;但在特定场景下却“水土不服”——比如在边缘设备上跑得太慢&#xff0c;或者对小…

作者头像 李华
网站建设 2026/3/19 15:50:33

基于SpringBoot技术的港口物流数据分析及可视化的设计与实现

目录具体实现截图项目介绍论文大纲核心代码部分展示可定制开发之亮点部门介绍结论源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作具体实现截图 本系统&#xff08;程序源码数据库调试部署讲解&#xff09;同时还支持Python(flask,django)、…

作者头像 李华
网站建设 2026/3/22 6:50:55

YOLOv8项目目录结构解析:/root/ultralytics详解

YOLOv8项目目录结构深度解析&#xff1a;从/root/ultralytics看现代AI工程化实践 在计算机视觉领域&#xff0c;目标检测早已不再是实验室里的概念玩具。随着智能安防、自动驾驶、工业质检等场景的爆发式增长&#xff0c;开发者对高效、稳定、可复用的目标检测方案提出了更高要…

作者头像 李华
网站建设 2026/3/22 15:10:58

找出数组中驻点和拐点

找出数组中驻点和拐点&#xff0c;即一阶导数为零点和二阶导数为零点。代码定义了两个函数&#xff1a;find_first_deriv_zeros和find_second_deriv_zeros&#xff0c;用于找到一阶和二阶导数的零点索引。主函数中有一个示例数据数组&#xff0c;并调用这两个函数来输出零点的索…

作者头像 李华