Vue2 项目二次封装Axios

引言

在现代前端开发中,HTTP请求管理是构建健壮应用的核心能力之一。Axios作为目前最流行的HTTP客户端库,其灵活性和可扩展性为开发者提供了强大的基础能力。

1. 为什么要二次封装Axios?

1.1 统一项目管理需求

  • API路径标准化:通过baseURL统一管理接口前缀
  • 超时控制:全局设置合理超时时间(如5s)
  • 错误统一处理:集中管理网络异常和业务异常

1.2 拦截器核心作用

拦截器类型功能说明
请求拦截器处理请求头配置、添加Token、显示Loading动画
响应拦截器处理响应数据格式、隐藏Loading、统一错误提示、刷新Token等
请求拦截器
添加认证Token
处理Content-Type
显示加载状态
响应拦截器
处理响应数据
统一错误提示
刷新Token

1.3 扩展性优势

  • 便于后期添加全局缓存策略
  • 统一处理安全认证机制
  • 简化各组件中的请求代码

2. Axios与其他HTTP库对比

特性XMLHttpRequestfetchjQuery.ajaxAxios
Promise支持
拦截器机制
自动JSON转换手动处理
取消请求
浏览器兼容性全部现代浏览器全部现代浏览器

2. 基础封装实现

2.1 创建核心实例

// utils/request.js  
import axios from 'axios'  // 创建基础实例  
const service = axios.create({  baseURL: '/api',   // 为每个请求添加上 /api 前缀timeout: 10000,  // 超时时间 10秒headers: {  'X-Requested-With': 'XMLHttpRequest'  }  
})  export default service  

2.2 请求拦截器实现

service.interceptors.request.use((config) => {// Token处理const token = localStorage.getItem("token");if (token) {config.headers.Authorization = `Bearer ${token}`;}return config;
});

2.3 响应拦截器分层处理

service.interceptors.response.use((res) => {// 成功响应处理if (res.data.code === 200) {return res.data;} else {return Promise.reject(res.data.message);}},(error) => {// 网络错误处理const errorMessage = error.response?.data?.message || "网络异常";console.error("API Error:", errorMessage);return Promise.reject(errorMessage);}
);

3. 接口模块化配置

3.1 创建API模块

一般在项目中,会对 api 统一管理,通常放在 src/api 目录下,并对其分模块管理,然后在 index.js 中统一暴露:

src/
├─ api/
│  ├─ system.js    # 系统相关接口
│  ├─ user.js      # 用户模块接口
│  ├─ product.js   # 商品模块接口
│  └─ index.js     # 统一导出入口

product. js 中编写方法:

// src/api/product.js
import request from "@/utils/request";/*** 获取商品基础分类列表*/
export const getBaseCategoryList = () => {return request({url: "/product/getBaseCategoryList",method: "get"});
};

然后统一暴露:

// index.js
export * as productAPI from "./product";

3.2 跨域解决

为什么会出现跨域?
  1. 浏览器的同源策略:是重要的安全机制,限制以下行为的跨域访问:

    • AJAX请求
    • DOM访问
    • Cookie/Storage读取
  2. 同源判定标准:协议+域名+端口 完全一致 才被允许访问

http://localhost:8080 ≠ https://localhost:8080 // 协议不同
http://a.com:8080 ≠ http://a.com:9090         // 端口不同
Vue项目解决方案(开发环境)
// vue.config.js
module.exports = {devServer: {proxy: {"/api": {                   // 匹配所有以/api开头的请求target: "http://gmall-h5-api.atguigu.cn",  // 后端服务器地址changeOrigin: true,       // 允许跨域}}}
};

注意: 配置完 vue.config.js 后需要重新启动。

配置项作用说明必要性
target指定代理目标服务器地址必选
changeOrigin将请求头中的host改为目标地址,绕过浏览器同源检测必选
pathRewrite重写请求路径,处理接口前缀差异可选

3.3 测试接口调用

main.js 中测试:

import {productAPI} from "@/api";  // 调用接口    
productAPI.getBaseCategoryList().then((data) => {  console.log(data);  
})

可以在控制台中看到,数据被成功输出:

![[Pasted image 20250123233827.png]]

4. 总结

通过对 Axios 进行二次封装,可以有效提升项目的开发效率和代码质量。在封装过程中,通过统一 API 路径、超时控制以及拦截器机制,不仅能集中管理请求与响应的逻辑,还能优化接口调用的可维护性和可扩展性。此外,通过模块化接口设计和跨域代理配置,我们能够更好地满足前后端分离架构下的开发需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/67980.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jmeter 动态参数压力测试时间段预定接口

🎯 本文档详细介绍了如何使用Apache JMeter进行压力测试,以评估预定接口在高并发场景下的性能表现。通过创建线程组模拟不同数量的用户并发请求,利用CSV文件动态配置时间段ID和用户token,确保了测试数据的真实性和有效性。文档中还…

Unity常用特性(Attribute)用法

一.UnityEngine命名空间 1.[Header(string)] inspector面板上给显示的字段上加一个描述 通常情况下,用于在 Inspector 窗口中创建字段的逻辑分组 public class AttributeTest : MonoBehaviour {[Header("public_field_num")]public int num; }2.[Tool…

vue项目的创建

运行第一个vue-cli应用程序 创建一个基于webpack模板的vue应用程序 vue init webpack 项目名根据自己需求选择 创建好之后如下 运行 cd vue01npm run dev运行之后如下 复制访问地址 : http://localhost:8080 停止服务 两次ctrlC 或者 一次ctrlc然后y idea中使用…

【CS61A 2024秋】Python入门课,全过程记录P3(Week5 Sequences开始,更新于2025/1/23)

文章目录 关于基本介绍👋新的问题Week5Mon Sequences阅读材料 关于 个人博客,里面偶尔更新,最近比较忙。发一些总结的帖子和思考。 江湖有缘相见🤝。如果读者想和我交个朋友可以加我好友(见主页or个人博客&#xff0…

android手机应用连接热点后无法进行tcp连接

你在WifiNetworkSpecifer连接回调onavaliable里,再次调用bindProcessToNetwork试试,我这边模拟了一下,是可以建立tcp连接的 你的那个应用我一直没编译成功,你试试吧,应该这样是可以的 另一个同事找到了类似的方法&…

【华为路由的arp配置】

华为路由的arp配置 ARP:IP地址与MAC地址的映射。 R1: g0/0/0:10.1.1.254/24 g0/0/1:10.1.2.254/24 PC1: 10.1.1.1/16 PC2: 10.1.1.2/16 PC3: 10.1.2.3/16 动态ARP 查看PC1的arp表,可以看到,列表为空。 查看R1的arp表 在PC3上ping命令测…

SPDK vhost介绍

目录 1. vhost技术的背景与动机Virtio 介绍virtio-blk数据路径为例 2. vhost技术的核心原理2.1 vhost-kernel2.2 vhost-user举例 2.3 SPDK vhostvhost的优势IO请求处理数据传输控制链路调整 3. SPDK vhost的实现与配置3.1 环境准备3.2 启动SPDK vhost服务3.3 创建虚拟块设备3.4…

电容的一些常用数值

如果是滤高频信号的小电容一般采用100nF 如果是滤低频信号的大电容一般采用10uF(10000nF) 比如这个LDO降压 两个一起用滤波效果会更好 如果想要供电引脚悬空,按理不能悬空,所以应该接大电阻接地,一般采用5.1KΩ 比如这个6Pin USB-TypeC的…

一个基于Python+Appium的手机自动化项目~~

本项目通过PythonAppium实现了抖音手机店铺的自动化询价,可以直接输出excel,并带有详细的LOG输出。 1.excel输出效果: 2. LOG效果: 具体文件内容见GitCode: 项目首页 - douyingoods:一个基于Pythonappium的手机自动化项目,实现了…

(回溯分割)leetcode93 复原IP地址

#include<iostream> #include<vector> #include<string> #include<algorithm> using namespace std; //卡尔的图不是按照程序执行过程而是直接画程序会执行的过程 // 实际执行是&#xff1a;n个字符&#xff0c;递推n1后&#xff08;叶子节点&#xff…

分子动力学模拟里的术语:leap-frog蛙跳算法和‌Velocity-Verlet算法

分子动力学模拟&#xff08;Molecular Dynamics Simulation&#xff0c;简称MD&#xff09;是一种基于经典力学原理的计算物理方法&#xff0c;用于模拟原子和分子在给定时间内的运动和相互作用‌。以下是关于分子动力学模拟的一些核心术语和概念&#xff1a; ‌定义系统‌&am…

智能工厂数字化化集成落地项目(交付版 67页)PPT 解读

基于工业4.0和工业智能化转型的甲方智能工厂数字化集成落地项目。报告分析了制造业的发展趋势&#xff0c;重点介绍了甲方为应对挑战而实施的商业模式创新和产业升级策略。通过引入乙方的智能工厂规划&#xff0c;构建了一个集成的数字化工厂架构&#xff0c;以提高生产效率和响…

Linux进度条实现

Linux进度条实现 1.\r\n2.缓冲区3.缓冲区分类4.进度条实现 &#x1f31f;&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f;&#x1f31f; &#x1f680;&#x1f680;系列专栏&#xff1a;【Linux的学习】 &#x1f4dd;&#x1f4dd;本篇内容&#xff1a;\…

基于java线程池和EasyExcel实现数据异步导入

基于java线程池和EasyExcel实现数据异步导入 2.代码实现 2.1 controller层 PostMapping("import")public void importExcel(MultipartFile file) throws IOException {importService.importExcelAsync(file);}2.2 service层 Resource private SalariesListener sa…

校验收货地址是否超出配送范围实战3(day09)

优化用户下单功能&#xff0c;加入校验逻辑&#xff0c;如果用户的收货地址距离商家门店超出配送范围&#xff08;配送范围为5公里内&#xff09;&#xff0c;则下单失败。 提示&#xff1a; ​ 1. 基于百度地图开放平台实现&#xff08;https://lbsyun.baidu.com/&#xff09…

Linux系统下速通stm32的clion开发环境配置

陆陆续续搞这个已经很久了。 因为自己新电脑是linux系统无法使用keil&#xff0c;一开始想使用vscode里的eide但感觉不太好用&#xff1b;后面想直接使用cudeide但又不想妥协&#xff0c;想趁着这个机会把linux上的其他单片机开发配置也搞明白&#xff1b;而且非常想搞懂cmake…

leetcode_3092. 最高频率的 ID

https://leetcode.cn/problems/most-frequent-ids/description/ 看到这个数据范围 最极端情况 如果nums全为一个数 并且数量取到最大 那么范围是10的10次方 需要longlong储存 这题主要运用了哈希表配合multiset实现 哈希表主要用作存储某个数的出现次数 mst则用于记录出现次…

【深度学习】 自动微分

自动微分 正如上节所说&#xff0c;求导是几乎所有深度学习优化算法的关键步骤。 虽然求导的计算很简单&#xff0c;只需要一些基本的微积分。 但对于复杂的模型&#xff0c;手工进行更新是一件很痛苦的事情&#xff08;而且经常容易出错&#xff09;。 深度学习框架通过自动…

如何把jupyter的一个.ipynb文件的多个单元格cell合并为1个cell

1 jupyter的一个.ipynb文件的多个单元格cell合并为1个cell 步骤 1&#xff1a;打开 your_notebook.ipynb 文件 启动 Jupyter Notebook。 导航到你的工作目录&#xff08;例如 F:\main&#xff09;。 打开 your_notebook.ipynb 文件。 步骤 2&#xff1a;选择所有单元格 点击…

集成Sleuth实现链路追踪

文章目录 1.新增sunrays-common-cloud模块1.在sunrays-framework下创建2.pom.xml3.查看是否被sunrays-framework管理 2.创建common-cloud-sleuth-starter1.目录结构2.pom.xml3.sunrays-dependencies指定cloud版本4.SleuthAutoConfiguration.java5.spring.factories 3.创建commo…