news 2026/2/5 11:52:46

Vue生态拓展与实战案例01,Vue 与 Axios 集成:优雅封装请求、拦截器与错误处理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Vue生态拓展与实战案例01,Vue 与 Axios 集成:优雅封装请求、拦截器与错误处理

在 Vue 项目开发中,网络请求是核心环节之一。Axios 作为一款功能强大的 HTTP 客户端,是 Vue 生态中最常用的请求工具,但直接在业务代码中零散使用 Axios 会导致代码冗余、维护困难,且难以统一处理请求 / 响应拦截、错误捕获等通用逻辑。本文将详细讲解如何优雅地封装 Axios,结合 Vue 实现请求拦截、响应拦截、统一错误处理,让网络请求层更规范、可维护。

一、前置准备:安装 Axios

首先在 Vue 项目中安装 Axios(适用于 Vue2/Vue3):

# npm npm install axios --save # yarn yarn add axios # pnpm pnpm add axios

二、核心封装:创建 Axios 实例

我们先创建一个独立的请求封装文件(如src/utils/request.js),通过创建 Axios 实例而非直接使用全局 Axios,可避免不同请求配置相互污染,同时便于定制化配置。

基础配置:创建实例

import axios from 'axios' // 创建Axios实例 const service = axios.create({ // 基础请求地址(可通过环境变量配置,区分开发/生产环境) baseURL: import.meta.env.VITE_API_BASE_URL || '/api', // 请求超时时间 timeout: 10000, // 请求头默认配置 headers: { 'Content-Type': 'application/json;charset=utf-8' } }) export default service

环境变量配置建议:在 Vue3+Vite 项目中,创建.env.development.env.production文件区分环境:

# .env.development VITE_API_BASE_URL = 'http://localhost:3000/api' # .env.production VITE_API_BASE_URL = 'https://prod-api.example.com/api'

三、拦截器:统一处理请求 / 响应

Axios 的拦截器分为请求拦截器(request)和响应拦截器(response),可在请求发送前、响应返回后执行通用逻辑,是封装的核心。

1. 请求拦截器:添加 Token、处理请求参数

请求拦截器常用于:

  • 给请求头添加认证 Token(如 JWT);
  • 统一处理请求参数(如序列化、添加公共参数);
  • 显示加载中状态(如 Loading 弹窗)。
// 续接上面的request.js import { ElMessage } from 'element-plus' // Vue3+Element Plus,Vue2可改用Element UI import { useUserStore } from '@/stores/user' // Pinia存储Token,Vue2可改用Vuex // 请求拦截器 service.interceptors.request.use( (config) => { // 1. 添加认证Token const userStore = useUserStore() if (userStore.token) { config.headers.Authorization = `Bearer ${userStore.token}` } // 2. GET请求参数序列化(可选) if (config.method === 'get' && config.params) { // 可自定义参数处理逻辑,如过滤空值 config.params = Object.fromEntries( Object.entries(config.params).filter(([_, v]) => v !== undefined && v !== null && v !== '') ) } // 3. 显示加载中(示例) // loadingInstance = ElLoading.service({ text: '请求中...' }) return config }, (error) => { // 请求发送失败时的处理 // loadingInstance?.close() // 关闭加载 ElMessage.error('请求发送失败,请检查网络') return Promise.reject(error) } )

2. 响应拦截器:统一处理响应、捕获业务错误

响应拦截器常用于:

  • 统一解析响应数据(剥离外层包装,只返回业务数据);
  • 处理 HTTP 状态码错误(如 401、403、500);
  • 关闭加载中状态;
  • 统一提示业务错误。
// 续接request.js service.interceptors.response.use( (response) => { // 关闭加载中 // loadingInstance?.close() // 假设后端返回格式:{ code: 200, data: {}, msg: '成功' } const { code, data, msg } = response.data // 业务成功 if (code === 200) { return data // 只返回核心数据,简化业务代码 } // 业务失败(如参数错误、权限不足等) ElMessage.error(msg || '请求失败') return Promise.reject(new Error(msg || '请求失败')) }, (error) => { // 关闭加载中 // loadingInstance?.close() // 处理HTTP状态码错误 const status = error.response?.status let errorMsg = '网络异常,请稍后重试' switch (status) { case 401: errorMsg = '登录失效,请重新登录' // 清除Token并跳转到登录页 const userStore = useUserStore() userStore.clearToken() window.location.href = '/login' break case 403: errorMsg = '暂无权限访问该资源' break case 404: errorMsg = '请求的资源不存在' break case 500: errorMsg = '服务器内部错误' break default: errorMsg = error.response?.data?.msg || errorMsg } ElMessage.error(errorMsg) return Promise.reject(error) } )

四、业务请求封装:按模块分类

封装好基础请求实例后,建议按业务模块(如用户、商品、订单)创建请求文件,让代码结构更清晰。

示例:src/api/user.js

import request from '@/utils/request' /** * 用户登录 * @param {Object} data - 登录参数(username/password) */ export const login = (data) => { return request({ url: '/user/login', method: 'post', data }) } /** * 获取用户信息 */ export const getUserInfo = () => { return request({ url: '/user/info', method: 'get' }) } /** * 修改用户信息 * @param {Object} data - 用户信息 */ export const updateUserInfo = (data) => { return request({ url: '/user/info', method: 'put', data }) }

五、在 Vue 组件中使用

封装完成后,在 Vue 组件中调用请求会非常简洁,且错误处理已统一封装,无需重复编写。

Vue3 组合式 API 示例

<template> <div> <el-button @click="getUserInfo">获取用户信息</el-button> </div> </template> <script setup> import { getUserInfo } from '@/api/user' import { ElMessage } from 'element-plus' const getUserInfo = async () => { try { // 直接获取核心数据,无需解析code/data const data = await getUserInfo() console.log('用户信息:', data) ElMessage.success('获取用户信息成功') } catch (error) { // 可选:特殊场景下自定义错误处理(通用错误已在拦截器处理) console.error('获取用户信息失败:', error) } } </script>

Vue2 选项式 API 示例

<template> <div> <el-button @click="getUserInfo">获取用户信息</el-button> </div> </template> <script> import { getUserInfo } from '@/api/user' import { Message } from 'element-ui' export default { methods: { async getUserInfo() { try { const data = await getUserInfo() console.log('用户信息:', data) Message.success('获取用户信息成功') } catch (error) { console.error('获取用户信息失败:', error) } } } } </script>

六、进阶优化:请求取消、重复请求拦截

1. 取消重复请求

避免短时间内重复发送相同请求(如多次点击提交按钮):

// 在request.js中添加 const pendingRequests = new Map() // 存储待处理的请求 // 生成请求唯一标识 const generateRequestKey = (config) => { return `${config.method}-${config.url}-${JSON.stringify(config.params || config.data)}` } // 添加请求到待处理列表 const addPendingRequest = (config) => { const key = generateRequestKey(config) config.cancelToken = new axios.CancelToken((cancel) => { if (!pendingRequests.has(key)) { pendingRequests.set(key, cancel) } }) } // 取消重复请求 const cancelPendingRequest = (config) => { const key = generateRequestKey(config) if (pendingRequests.has(key)) { const cancel = pendingRequests.get(key) cancel('重复请求已取消') pendingRequests.delete(key) } } // 在请求拦截器中添加 service.interceptors.request.use( (config) => { // 取消重复请求 cancelPendingRequest(config) // 添加当前请求到待处理列表 addPendingRequest(config) // 原有逻辑... return config }, (error) => { // 原有逻辑... } ) // 在响应拦截器中移除已完成的请求 service.interceptors.response.use( (response) => { cancelPendingRequest(response.config) // 原有逻辑... }, (error) => { cancelPendingRequest(error.config) // 原有逻辑... } )

2. 自定义请求配置

支持业务请求覆盖默认配置(如超时时间、响应类型):

// 示例:上传文件请求(修改Content-Type) export const uploadFile = (data) => { return request({ url: '/upload', method: 'post', data, headers: { 'Content-Type': 'multipart/form-data' }, timeout: 30000 // 上传文件超时时间延长至30秒 }) }

七、总结

通过以上封装,我们实现了 Vue 与 Axios 的优雅集成,核心优势如下:

  1. 代码复用:统一的请求 / 响应拦截逻辑,避免业务代码冗余;
  2. 易于维护:按模块拆分请求,配置集中管理,修改更便捷;
  3. 用户体验:统一的加载状态、错误提示,提升交互一致性;
  4. 健壮性:处理了 Token 过期、重复请求、网络异常等边界场景;
  5. 简洁易用:业务代码只需关注核心逻辑,无需重复解析响应、捕获错误。

这套封装方案适配 Vue2 和 Vue3,可根据项目实际需求(如 UI 框架、状态管理工具)灵活调整,是 Vue 项目中网络请求层的通用最佳实践。

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

QwQ-32B-AWQ:4-bit量化大模型的低成本高效部署指南

QwQ-32B-AWQ&#xff1a;4-bit量化大模型的低成本高效部署指南 【免费下载链接】QwQ-32B-AWQ 项目地址: https://ai.gitcode.com/hf_mirrors/Qwen/QwQ-32B-AWQ QwQ-32B-AWQ是阿里通义千问团队推出的4-bit量化推理模型&#xff0c;通过先进的AWQ量化技术实现32.5B参数模…

作者头像 李华
网站建设 2026/2/2 8:46:27

2025最新!9个AI论文平台测评:研究生开题报告必备神器

2025最新&#xff01;9个AI论文平台测评&#xff1a;研究生开题报告必备神器 2025年AI论文平台测评&#xff1a;助力研究生高效完成开题报告 随着人工智能技术的不断进步&#xff0c;越来越多的学术研究者开始借助AI工具提升写作效率与质量。对于研究生群体而言&#xff0c;开题…

作者头像 李华
网站建设 2026/2/3 6:58:35

或非门作为通用门的初步认识:入门学习

从零开始理解或非门的“万能”本质&#xff1a;不只是逻辑&#xff0c;更是设计哲学你有没有想过&#xff0c;一个看似简单的逻辑门——或非门&#xff08;NOR Gate&#xff09;&#xff0c;竟然可以独自撑起整个数字世界的底层大厦&#xff1f;它不像与非门那样在现代芯片中无…

作者头像 李华
网站建设 2026/1/31 2:28:12

用Miniconda-Python3.9搭建Stable Diffusion本地运行环境

用Miniconda-Python3.9搭建Stable Diffusion本地运行环境 在生成式AI席卷创意与工程领域的今天&#xff0c;越来越多开发者不再满足于调用云端API来生成图像。隐私顾虑、响应延迟和定制化限制&#xff0c;正推动一股“回归本地”的部署浪潮——尤其是在使用像 Stable Diffusion…

作者头像 李华
网站建设 2026/2/4 10:54:44

基于java + vue社区团购系统(源码+数据库+文档)

社区团购 目录 基于springboot vue社区团购统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 基于springboot vue社区团购统 一、前言 博主介绍&#xff1a;✌️大厂码…

作者头像 李华
网站建设 2026/2/5 11:06:59

GitHub星标项目推荐:基于Miniconda的轻量AI开发模板

GitHub星标项目推荐&#xff1a;基于Miniconda的轻量AI开发模板 在数据科学和人工智能项目的日常开发中&#xff0c;你是否曾遇到过这样的场景&#xff1f;刚配置好的PyTorch环境&#xff0c;因为安装了一个新包导致训练脚本突然报错&#xff1b;团队成员复现论文实验时&#x…

作者头像 李华