以下是一个功能完善、可扩展、鲁棒性强的 axios 通用封装(request.js),涵盖请求/响应拦截、错误统一处理、重复请求取消、请求配置扩展、常用请求方法封装等核心能力,适配大部分前端项目场景。
最终代码(request.js)
1 | import axios from 'axios'; |
核心功能说明
1. 基础配置
- 基于环境变量配置
baseURL(适配 Vite 项目,Webpack 可替换为process.env.VUE_APP_API_BASE_URL); - 默认超时时间 10s,可通过请求配置覆盖;
- 统一设置
Content-Type为 JSON 格式。
2. 重复请求取消
- 用
Map存储请求标识和取消令牌,避免同一时间重复发起相同请求; - 请求发起前检查是否已有相同请求,有则取消旧请求,保证请求唯一性。
3. 请求拦截器
- 自动注入 Token(适配 Vue3 Pinia,可替换为 Vuex/
localStorage); - 处理 GET 请求参数(移除
undefined参数,避免请求异常); - 支持自定义加载中状态(默认开启,可通过请求配置关闭)。
4. 响应拦截器
- 统一解析后端返回格式(
{ code, msg, data }),成功时直接返回data,简化上层调用; - 针对 401(登录过期)做统一登出处理;
- 分类处理错误:取消请求、超时、HTTP 状态码、网络异常,给出精准提示。
5. 通用方法封装
- 封装
get/post/put/del常用方法,简化调用; - 单独封装
upload方法,适配文件上传(调整请求头、延长超时时间)。
使用示例
1 | import { get, post, upload } from '@/utils/request'; |
扩展与适配
- UI 库替换:若不用 Element Plus,可将
ElMessage/ElMessageBox替换为其他 UI 库的提示组件(如 Ant Design Vue 的message/modal),或自定义提示函数。 - 状态管理适配:Token 存储若用 Vuex,替换
useUserStore为store.dispatch/store.getters;若用本地存储,直接读取localStorage.getItem('token')。 - 后端返回格式调整:若后端返回格式不是
{ code, msg, data },修改响应拦截器中的解析逻辑即可。 - 请求加载中:可集成
ElLoading(Element Plus)或自定义加载组件,在请求拦截器开启、响应拦截器关闭。 - 更多配置:可扩展请求头、代理、SSL 验证等,直接在
axios.create或请求配置中添加。
核心原则
- 统一化:请求/响应拦截统一处理通用逻辑(Token、错误、加载中),减少重复代码;
- 可扩展:保留自定义配置入口,支持覆盖默认行为;
- 鲁棒性:处理各类异常场景(重复请求、超时、网络错误、业务错误),避免页面崩溃;
- 易用性:封装通用方法,上层调用只需关注接口地址和参数,无需关心底层逻辑。