详细讲解axios封装与api接口封装管理
一、axios封装
axios是基于promise的http客户端,用于浏览器和nodejs发送http请求 ,对它进行封装主要是为了统一管理请求配置和处理请求和响应的通用逻辑等。以下是常用的封装逻辑和要点
1:引入axios相关依赖
首先引用项目中的axios库,在nodejs项目中通常使用require语句,在基于现代js模块系统(如ES Module)的前端项目中则使用import来引入。实例如下
import axios from 'axios'
//如果需要先处理环境变量等,可以引入相关模块,比如在Node.js中引入process模块来获取环境相关配置
// const process = require('process');
2:创建axios实例
直接使用axios的默认配置有时候不能满足项目需求,所以通常会创建一个axios实例,并在实例上配置一些通用的请求设置,比如基础URL,请求超时时间,请求头信息。示例代码如下
const severce = axios.create({baseURL: process.env.VUE_APP_BASE_API || '/api', // 可以从环境变量获取基础URL,如果没有则使用默认的'/api',常用于根据不同环境(开发、生产等)切换后端接口地址timeout: 5000, // 设置请求超时时间为5000毫秒(5秒),避免长时间无响应的请求一直挂起headers: {'Content-Type': 'application/json' // 设置默认的请求头内容类型,根据实际项目后端要求可调整,比如也可能是'application/x-www-form-urlencoded'等}
})
3:请求拦截设置
请求拦截可以在每个请求发送前执行一些逻辑,常见的比如添加鉴权token到请求头中,显示加载动画等,示例代码如下:
instance.interceptors.request.use(config => {const token = localStorage.getItem('token'); // 从本地存储获取token,实际可能根据项目的登录认证机制来获取if (token) {config.headers.Authorization = `Bearer ${token}`; // 将token添加到请求头的Authorization字段,格式可能根据后端要求调整}// 这里也可以添加代码显示加载动画,比如使用一些UI库提供的加载组件来控制显示隐藏return config;},error => {return Promise.reject(error); // 如果请求拦截出现错误,直接返回被拒绝的Promise,将错误传递下去}
);
4:响应拦截设置
响应拦截器用于在收到服务器响应后统一处理相关逻辑,例如根据响应状态码判断请求是否成功,处理业务错误提示,隐藏加载动画等,示例代码如下:
instance.interceptors.response.use(response => {// 可以在这里隐藏加载动画,和请求拦截器中显示加载动画配合使用const { data, status } = response;if (status === 200) { // 根据项目实际的成功状态码判断,这里假设200表示成功return data;} else {// 如果状态码不是200,可以在这里统一处理错误,比如弹出提示框等,然后返回一个被拒绝的Promisereturn Promise.reject(new Error('请求失败'));}},error => {// 处理响应出现的网络错误等情况,比如断网、服务器内部错误等,同样可以弹出错误提示,返回被拒绝的Promisereturn Promise.reject(error);}
);
5:导出封装后的axios实例
最后将封装好的axios实例导出,以便在项目其他地方可以方便的使用它来发送请求,示例代码如下:
export default instance;
二、api 接口封装管理
在完成axios封装后,通常还会对项目的各个api接口,进行进一步的封装管理,这样做的好处是让接口调用更加清晰,易于维护和扩展,并且可以将接口相关的业务逻辑整合到一起
1:创建api文件模块
一般会按照功能模块或者业务模块来创建对应的api文件,
例如在一个电商项目中,可能有user.js用于管理用户的相关接口,product.js用于管理商品相关接口等。以 user.js 为例,示例代码如下:
import instance from '@/axio(axios的路径)' // 引入封装好的axios实例// 用户登录接口封装
export const login =(params传递过来的参数)=>{// 发送POST请求到/user/login路径,params为传递给后端的登录参数,返回的是一个Promise,方便 在调用处使用.then()和.catch()处理结果和错误return instance.post('接口路径',params)}// 获取用户信息接口封装
export const getUserInfo =(params传递过来的参数)=>{// 发送GET请求获取用户信息,同样返回Promisereturn instance.post('接口路径',params)}
2:整合api接口
可以创建一个统一的api目录,将各个api的文件放在里面,然后创建一个index.js文件(或者其他合适的整合文件名称)来统一导出所有的接口函数,方便在项目的其他地方(比如组件中)一次性引入使用。示例代码如下:
import { login } from './user';
import { getProductList } from './product';export default {login,getProductList
};
3:在组件等地方使用封装后的api接口
在 Vue 组件或者其他 JavaScript 模块中使用封装后的 API 接口时,代码会变得简洁且逻辑清晰,示例如下(以 Vue 组件为例):
<template><div><button @click="handleLogin">登录</button></div>
</template><script>
import api from '@/api'; // 引入整合后的api接口export default {methods: {async handleLogin() {const params = { username: 'test', password: '123456' };try {const result = await api.login(params); // 调用登录接口,使用await等待异步结果console.log('登录成功', result);// 可以在这里进行后续操作,比如保存登录信息、跳转到其他页面等} catch (error) {console.log('登录失败', error);// 处理登录失败的情况,比如弹出提示框等}}}
};
</script>
通过对 axios 进行封装以及进一步对 api 接口进行封装管理,能够让项目中的 HTTP 请求处理更加规范、高效,便于不同开发人员协作以及后续项目的维护和扩展。同时,也能更好地处理请求和响应过程中的各种业务逻辑和异常情况。
相关文章:
详细讲解axios封装与api接口封装管理
一、axios封装 axios是基于promise的http客户端,用于浏览器和nodejs发送http请求 ,对它进行封装主要是为了统一管理请求配置和处理请求和响应的通用逻辑等。以下是常用的封装逻辑和要点 1:引入axios相关依赖 首先引用项目中的axios库&…...
API 接口如何确保数据的安全?
在API接口的对接中,确保数据的安全性是至关重要的。以下是一些关键措施,可以帮助实现这一目标: 一、认证与授权 API密钥:为每个调用方分配唯一的API密钥,客户端在请求时携带该密钥,服务器端验证其有效性。…...
HAL库STM32硬件IIC驱动数字电位器MCP4017
目录 一、芯片特性 二、硬件电路 三、工程搭建 四、IIC硬件地址 五、驱动程序 项目需要,最近用到了一个IIC接口的数字电位器,型号:MCP4017T-502E。对应阻值5K,使用STM32G030F6的硬件IIC驱动,发现简单的不得了&…...
「地平线」副总裁余轶南与「理想汽车」智驾产品总监赵哲伦联手创业,入局具身智能赛道!
小编早期文章:智驾领域从业者,疯狂涌入人形机器人赛道!就有提到智驾领域从业者入局人形机器人赛道是趋势并分析原因。 之前媒体报道的智驾芯片上市公司【地平线】创始成员、副总裁、前软件平台产品线总裁余轶南(博士)…...
弹性盒子(display: flex)布局超全讲解|Flex 布局教程
文章目录 弹性盒子flex什么是弹性布局?弹性布局的特点?justify-contentalign-itemflex-direction (主轴的方向:水平或者垂直)flex-wrapflex-flowalign-contentflex-grow 属性flex-shrink 属性flex-basis 属性flex 属性align-self 属性 弹性盒…...
无问社区-无问AI模型
无问AI模型是无问社区新上线的一款AI功能,支持文本图像的输入,在文本理解能力、推理能力、视觉能力上相较于“社区助手”有了很大的提升。 我们在预训练模型的技术上增加1.7亿token的训练数据进行强化训练使其具备更好的效果。 更好的消息是我们准备了…...
如何记录日常笔记
如何使用Obsidian来记录日常的笔记吗?比如会议记录、读书笔记。 我认为,首先需要做好的就是建立一个单独的分类,比如设置会议记录的文件夹、读书笔记的文件夹,这样各个笔记相互不干扰。 而做日常记录,和我们进行卡片…...
【魅力golang】之-反射
1、引言 反射(Reflection)在 Golang中用于运行时检查和操作变量的类型和值。通过反射,可以实现动态类型处理,这在构建泛型代码、框架、序列化工具和动态代理等场景中非常有用。 2、什么是反射 反射是指程序在运行时能够动态地检…...
git--批量修改本地用户名和邮箱
原文网址:git--批量修改本地用户名和邮箱-CSDN博客 简介 本文介绍git如何批量修改项目的本地用户名和邮箱。 脚本 新建脚本:git_config.sh,内容如下: #!/bin/bash topDirpwd echo "开始处理" for file in ls ./ do…...
Rofin罗芬激光PowerLine L300 PL400 Manual 软件
Rofin罗芬激光PowerLine L300 PL400 Manual 软件...
【 thefuck 安装与使用】Linux 终端自动纠错工具:一头GitHub上的“草泥马“ - thefuck,妈妈再也不用担心我打错命令行了!
目录 快速安装使用 . 1.简介 2.安装 3.配置 4.补充 官方盗料参考 快速安装使用 快速安装使用,四步即可: #Ubuntu/Debian系统 sudo apt update sudo apt install python3-dev python3-pip sudo pip3 install thefuck #编辑bashrc配置文件 vim ~/.bashrc…...
牛客网刷题 ——C语言初阶——BC112小乐乐求和
1.牛客网刷题 ——C语言初阶 牛客网:BC112小乐乐求和 小乐乐最近接触了求和符号Σ,他想计算的结果。但是小乐乐很笨,请你帮助他解答。 输入描述: 输入一个正整数n (1 ≤ n ≤ 109) 输出描述: 输出一个值,为求和结果。 示例1 输…...
【PyTorch】(基础七)---- 完整训练流程
首先要明确一点,我们在编写模型、训练和使用模型的时候通常都是分开的,所以应该把Module的编写以及train方法和test方法分开编写。 调用gpu进行训练:在网络模型,数据,损失函数对象后面都使用.cuda(&#x…...
01- 三自由度串联机械臂位置分析
三自由度串联机械臂如下图所示(d180mm,L1100mm,L280mm),利用改进DH法建模,坐标系如下所示: 利用改进DH法建模,该机器人的DH参数表如下所示: 对该机械臂进行位置分析&…...
Flutter实现可拖拽操作Draggable
文章目录 1. Draggable 控件的构造函数主要参数: 2. Draggable 的工作原理3. 常见用法示例 1:基本的拖拽控件解释:示例 2:与 DragTarget 配合使用解释: 4. Draggable 的回调详解5. 总结 Draggable 是 Flutter 中一个用…...
Vue BPMN Modeler流程图
1、参考地址 git clone https://github.com/evanyangg/vue-bpmn-modeler.git 2、安装bpmn.js npm install bpmn-js --save 3、使用bpmn.js <template><div class"containers"><div class"canvas" ref"canvas"></div&g…...
写在公司40周年前夕
日子太快了,来这里工作六年多了。现在才知道原来入职的公司只是母公司的一小点。刚来一年就碰到疫情,三年疫情之后就迎来亏损,而后就是变了董事长,换了总经理。 这圣诞前,所有的子分又换了一把手。动作之大,…...
Python调用Elasticsearch更新数据库
文章目录 Elasticsearch介绍Python调用Elasticsearch更新数据库 Elasticsearch介绍 Elasticsearch是一个基于Lucene的搜索引擎,它提供了一个分布式、多租户能力的全文搜索引擎,具有HTTP web接口和无模式的JSON文档。Elasticsearch是用Java开发的&#x…...
测试基础之测试分类
软件测试是确保软件产品满足预期功能、性能和用户体验要求的关键环节。它的主要目的是通过系统化的方法发现并修复软件中的缺陷,从而提高软件的质量和可靠性。在软件开发生命周期的不同阶段执行测试,以尽早发现潜在的错误或类型,早期发现缺陷…...
太阳能LED路灯智能控制系统(论文+源码)
1系统的功能及方案设计 本次课题为太阳能LED路灯智能控制系统,其系统整体架构如图2.1所示,太阳能板通过TP4056充电模块给锂电池进行充电,电池通过HX3001升压模块进行升压到5V给整个控制系统进行供电,控制系统由AT89C52单片机作为…...
从下载到调用:AutoGLM-Phone-9B完整部署与OpenAI接口对接实战
从下载到调用:AutoGLM-Phone-9B完整部署与OpenAI接口对接实战 1. 为什么你需要关注AutoGLM-Phone-9B 想象一下,你正在开发一款手机应用,需要让用户上传一张照片,然后AI不仅能看懂照片内容,还能用语音回答用户的问题&…...
gte-base-zh WebUI安全加固:禁用CORS、关闭Swagger UI、限制Referer白名单
gte-base-zh WebUI安全加固:禁用CORS、关闭Swagger UI、限制Referer白名单 重要提示:本文介绍的安全加固方案适用于生产环境部署,可有效防止未授权访问和数据泄露风险。 1. 为什么需要WebUI安全加固 当你使用xinference部署gte-base-zh embe…...
Windows下OpenClaw安装避坑:Qwen3.5-9B模型接入全记录
Windows下OpenClaw安装避坑:Qwen3.5-9B模型接入全记录 1. 为什么选择OpenClawQwen3.5-9B组合 去年12月我在整理年度技术文档时,被重复的文件归类操作折磨得苦不堪言。当时尝试过用Python脚本自动化处理,但面对动态变化的文件命名规则总是力…...
C++编程中堆与栈内存的差异解析
C编程中堆与栈内存的差异解析 在C编程的世界里,内存管理是一个核心且至关重要的概念。其中,堆(Heap)与栈(Stack)作为两种主要的内存分配区域,各自扮演着不同的角色,理解它们之间的区…...
LN2266 超小型 低电压启动 PWM 控制 升压 DC/DC 电压调整器
■ 产品概述 LN2266 是一款微型、高效率、升压 DC/DC 调整器。电路由电流模 PWM 控制环路,误差放大器,斜波产生电路,比较器和一个功率开关等模块组成。该芯片可在较宽负载范围内高效稳定的工作。低于 1V 的启动电压,可以使用 1-4节…...
程序实现多参数联动判断,单一参数异常不报警,多参数契合才报警,零误报。
一、实际应用场景描述某高校《智能仪器》综合实验项目中,有一套电机运行状态监测系统:- 监测参数:- 电流(A)- 振动(mm/s)- 温度(℃)现场现象:- 电机启动时&am…...
RHCE练习
练习: 1. 在4月份的周一到周三的上午11点执行 0 11 * 4 1-3 2. 每天早上7点到上午11点且每2小时执行一次 0 7-11/2 * * *3. 每天6点执行 0 6 * * * 4. 每周六凌晨4点执行 0 4 * * 65. 每周六凌晨4点05执行 5 4 * * 66. 每天8:40执行 40 8 * * *7. 在每天…...
Candleduino:面向MAB驱动器的跨平台CAN控制库
1. Candleduino库概述:面向MAB Robotics驱动器的跨平台CAN控制解决方案Candleduino是一个专为嵌入式平台设计的Arduino兼容C库,核心目标是实现对MAB Robotics公司MD系列伺服驱动器(Motor Drive)与PDS系列电源分配系统(…...
ESP32/ESP8266轻量级二进制RPC库设计与实践
1. 项目概述esp_rpc是一个专为 ESP8266 和 ESP32 平台深度优化的轻量级远程过程调用(Remote Procedure Call, RPC)库。其设计哲学直指嵌入式资源受限场景的核心矛盾:在极小内存占用(ROM/RAM 双敏感)与可靠跨设备交互之…...
程序员必看:代码注释规范与重构实战指南
1. 程序员入职第一天的震撼教育那天早上九点整,我刷完门禁卡走进新公司的办公区,工位上已经摆好了全新的MacBook Pro和一台4K显示器。行政小姐姐热情地带着我走完入职流程后,我迫不及待地打开代码仓库,准备熟悉项目。就在我点开核…...
