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

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.kler.cn/a/515964.html

相关文章:

  • Git常用命令
  • 考研机试:买房子
  • 计算机网络之网络层
  • MinIO的安装与使用
  • Apache Hive3定位表并更改其位置
  • 时序数据库的使用场景
  • MYSQL学习笔记(五):单行函数(字符串、数学、日期时间、条件判断、信息、加密、进制转换函数)讲解
  • 如何选择TVS二极管?
  • Vue - toRefs() 和 toRef() 的使用
  • 准备知识——波纹度和粗糙度区别与联系
  • 【力扣】1312. 让字符串成为回文串的最少插入次数
  • 法律与认知战争:新时代的战略博弈
  • 8.2 从看图识字到智能解读:GPT-4 with Vision 开启多模态 AI 新纪元
  • Ubuntu下载zenodo文件Ubuntu download zenodo
  • springboot基于微信小程序的手机银行系统
  • 如何区分AI智能体、自动化工作流和PRA?
  • 《Openlayers零基础教程》第十八课:Canvas绘制圆—绘制两个圆
  • 【Trunk接口配置】
  • 【React】 react路由
  • 探索前端新技术:Svelte 与创新前端开发范式
  • 语音转文字的先驱-认识Buzz的前世今生
  • kconfig语法里,怎么实现二选一配置?
  • 什么是僵尸进程
  • kalman滤波器C++设计仿真案例
  • C++中,存储两个相同类型的数据,数据结构
  • 探秘 Java IO 与 NIO:春招面试知识要点