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

VUE中使用AXIOS包装API代理

VUE中使用AXIOS包装API代理

0. 背景

在VUE开发过程,与后端接口交互时,可以简单几句代码就剋调用后端POST或者GET请求.
实际效果就是,前端定义一个对象

{getPageList: 'GET /pagelist',commitData: 'POST /savedata',getDetail: 'GET /detail/{id}',
}

然后在业务代码中就可以调用getPageList方法,实际效果就是发送一个GET请求,请求地址为/pagelist
常用场景如下:

  • api.getPageList("gameName=地心侠士&gameType=小游戏') 会转换成GET请求,参数在URL上 /pagelist?gameName=地心侠士&gameType=小游戏
  • api.commitData({gameName:"地心侠士",gameType:"小游戏"}) 会转换成POST请求,参数通过JOSN提交 /savedata
  • api.getDetail({id:1}) 会转换成GET请求,参数在URL上 /detail/1

1. 整合全局axios配置

整合axios主要是配置一些全局的请求,响应,以及请求头,请求超时配置等.全局配置代码request.js如下:

import axios from 'axios';
import loading from './loading';
const ENV = import.meta.env;
const { VITE_GLOB_API_URL } = ENV;
let req = axios.create({baseURL: VITE_GLOB_API_URL || '',timeout: 30000,params: {'g.type': '1'},headers:{'g.type': '1'},
});
// 请求拦截 公众号 小满小慢
req.interceptors.request.use((cfg) => {loading.showLoading();return cfg;
});
// 响应拦截 公众号 小满小慢
req.interceptors.response.use((resp) => {loading.hideLoading();if (resp.data.code && resp.data.code != '0') {// 全局拦截错误信息loading.showError(resp.data.message);return Promise.reject(resp.data);}return resp;},(error) => {loading.hideLoading();if (error.response && error.response.data) {loading.showError(error.response.data.message);}return Promise.reject(error);},
);
export default {request: req.request, 
};

2. 创建API请求包装器

请求包装器主要有以下作用

  • 请求参数处理
  • 通用接口暴露

实际效果可以把 GET /pagelist 暴露成一个可以调用的方法
,创建API请求包装器apiconvert.js如下:

import req from './request.js';
export function convertApi(apis) {const ENV = import.meta.env;const { VITE_GLOB_API_URL } = ENV;const api = {};for (const key in apis) {const apiInfos = apis[key].split(' ');const [method, apiUrl] = apiInfos;let base = VITE_GLOB_API_URL;if (key == 'ajax') base = '/';api[key] = (data) => {return new Promise((resolve, reject) => {let targetUrl = apiUrl;if (method === 'GET' && data && typeof data === 'string') {// get请求参数处理 公众号 小满小慢data = encodeURI(data);const index = targetUrl.indexOf('?');if (index === -1) {data = `?${data}`;}targetUrl = `${targetUrl}${data}`;data = null;}if (/{\w+}/.test(targetUrl)) {targetUrl = targetUrl.replace(/{(\w+)}/gi, function (match, p) {return data[p] || '0'; });console.log(`change url:${targetUrl}`);}req.request({ method: method, url: targetUrl, data: data,baseURL: base}).then((res) => resolve(res.data)).catch((error) => {reject(error);});});};}return api;
}
// 暴露一个通用接口
const api = convertApi({ajax: 'GET /commonDataProc',
});export default api;

3. 使用API请求包装器

实际的业务接口可以通过键值对的方式配置,然后通过convertApi方法进行转换,转换后的接口可以调用.
如下:

  • 'GET /pagelist'
  • 'POST /savedata'

实际业务接口biz_api.js 定义如下

import commapi, { convertApi } from '@/assets/js/apiconvert';
const api = convertApi({// 这里可以扩展业务接口getPageList: 'GET /pagelist',
});
// 合并通用接口
Object.assign(api, commapi);
export default api;

4. 使用业务接口

实际业务代码中,通过import api from '@/assets/js/biz_api'引入业务接口,然后调用业务接口即可.

import api from './biz_api.js'
const data = ref([]);
const loadingStatus = ref(true);
async function getPages() {const res = await api.getPageList();let arr = [];for (let i in res) {arr.push(res[i]);}data.value = arr;loadingStatus.value = false;
}
onMounted(() => {getPages()
});

5. 总结

通过以上封装后,前端调用后端的API清晰明了.api定义在单独的文件,也可以自由组合. 从设计上来说,主要使用了两层代理转换.
所有还是印证那句话,一层代理解决不了问题,那就再加一层.
以上仅为个人项目落地总结,若有更优雅的方式,欢迎告知.微信公众号:小满小慢 私信或者直接留言都可以.
原文地址 https://mp.weixin.qq.com/s/aqHVyq_I3m0QcSbKDqCxuQ

http://www.gsyq.cn/news/88320.html

相关文章:

  • 2025年年终首创者认证机构推荐:基于权威方法论与千家企业案例的深度评测与2家高可靠性服务商清单 - 十大品牌推荐
  • 市场机会到来时,你的嵌入式软件能否在数周内交付?
  • 聚集搭子社交组局小程序,我们这样开发!
  • 如何选择一家靠谱的GPU服务器供应商?2025年年终最新市场评估与5家专业公司推荐 - 十大品牌推荐
  • CTF比赛必备常用工具,建议收藏!
  • 2025-2026年智慧实验室哪家好?实验室安全智慧系统/控制系统、耗材物资智慧管理系统知名品牌优质供应商推荐 - 品牌推荐大师1
  • 2025年年终首创者认证机构推荐:从方法论严谨性到售后保障的全维度横评,附2家优质服务商深度解析 - 十大品牌推荐
  • 智慧农业新未来:数智赋能如何重塑农业生产模式?
  • 详细介绍:基于React的开源框架Next.js、UmiJS、Ant Design Pro
  • java+vue+SpringBoot文档管理系统(程序+数据库+报告+部署教程+答辩指导)
  • 69、《gawk 编程语言与源代码管理系统入门》
  • 轻松部署Qwen3-4B-FP8模型:从零开始的本地推理实战
  • 合规视角的数据安全与隐私:HIPAA等法规的架构内生化实践
  • 2025年12月企业境外投资备案/odi登记/境外投资备案/odi备案服务商户全面解析:卓信企业登顶 - 2025年11月品牌推荐榜
  • 按照官网适配的版本配置了MindSpore等,还是一直报错
  • Springboot少儿教育网站k5t0n(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • TIA博途虚拟机终极配置指南:V17+V16+V15.1全版本一键部署
  • 大二计算机生的Vue.js高分学习笔记:从课程作业到实习储备
  • 如何高效抓取淘宝直播弹幕数据:完整实战指南
  • 艾体宝干货 |【Redis实用技巧#5】掌握 Redis 与 Kafka,搞定系统设计
  • 如何选择靠谱的市场认证公司?2025年年终最新服务商评估方法论及5家专业机构推荐! - 十大品牌推荐
  • 44、Linux 系统用户与组管理及打印、日志操作全解析
  • 60、深入理解与配置 SSH:安全远程访问的全面指南
  • Flipper Zero NFC技术:5大实战应用场景全解析
  • 领嵌16路RS485/232串口服务器双网口支持4G通信WIFI蓝牙
  • es 集群半数以上master节点掉线解决方法
  • MailKit实战指南:5个核心技巧快速实现Gmail邮件集成
  • RadeGS——UnboundLocalError: local variable scene_info referenced before assignment
  • 腾讯混元0.5B轻量化模型:小参数撬动边缘智能革命
  • 2025最新!中国十大电线品牌权威排名 - 黑马榜单