详细讲解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 请求处理更加规范、高效,便于不同开发人员协作以及后续项目的维护和扩展。同时,也能更好地处理请求和响应过程中的各种业务逻辑和异常情况。

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

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

相关文章

搭建Elastic search群集

一、实验环境 二、实验步骤 Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎Elasticsearch目录文件&#xff1a; /etc/elasticsearch/elasticsearch.yml#配置文件 /etc/elasticsearch/jvm.options#java虚拟机 /etc/init.d/elasticsearch#服务启动脚本 /e…

正点原子串口例程解读

首先是串口初始化&#xff0c;这里初始化的是usart3 void esp8266_init(void) {huart_wifi.InstanceESP8266; //uart3huart_wifi.Init.BaudRate115200; // 设置波特率为115200huart_wifi.Init.WordLengthUART_WORDLENGTH_8B; // 设置数据位长度为8位huart_wifi.Init.StopBi…

KVM虚拟机管理脚本

思路&#xff1a; 在/opt/kvm下创建一个磁盘文件&#xff0c;做差异镜像&#xff0c;创建一个虚拟机配置文件&#xff0c;做虚拟机模版 [rootnode01 ~]# ls /opt/kvm/ vm_base.qcow2 vm_base.xml创建虚拟机的步骤&#xff1a;首先创建虚拟机的差异镜像&#xff0c;然后复制虚…

Null value was assigned to a property of primitive type setter of 的原因与解决方案

Null value was assigned to a property of primitive type setter of 的原因与解决方案 org.hibernate.PropertyAccessException: Null value was assigned to a property of primitive type setter of com.xxx.xxx.DealerUser.dealerId数据库表结构 实体类 当数据库的dealer…

【数据结构与算法】排序算法(下)——计数排序与排序总结

写在前面 书接上文&#xff1a;【数据结构与算法】排序算法(中)——交换排序之快速排序 文章主要讲解计数排序的细节与分析源码。之后进行四大排序的总结。 文章目录 写在前面一、计数排序(非比较排序)代码的实现&#xff1a; 二、排序总结 2.1、稳定性 3.2、排序算法复杂度及…

Multi移动端开发

Multi移动端开发 安装环境 安装功能 VS2022安装 【ASP.NET和Web开发】、【.NET Multi-platform App UI开发】、【.NET桌面开发】 配置程序源 【工具】–>【选项】–>【NuGet包管理器】–>【程序包源】&#xff0c;添加如下&#xff1a; 名称&#xff1a;MES_APP 源&…

若依plus apifox导入接口显示为空

项目已经正常启动 访问接口有些没问题&#xff0c;有些有问题 其他模块都可以正常导入 解决&#xff1a;

音视频入门基础:AAC专题(13)——FFmpeg源码中,获取ADTS格式的AAC裸流音频信息的实现

音视频入门基础&#xff1a;AAC专题系列文章&#xff1a; 音视频入门基础&#xff1a;AAC专题&#xff08;1&#xff09;——AAC官方文档下载 音视频入门基础&#xff1a;AAC专题&#xff08;2&#xff09;——使用FFmpeg命令生成AAC裸流文件 音视频入门基础&#xff1a;AAC…

英文学术会议海报poster模板【可编辑】

英文学术会议海报poster模板【可编辑】 下载链接&#xff1a;学术会议海报poster模板【可编辑】 横版海报 竖版海报 下载链接&#xff1a;学术会议海报poster模板【可编辑】 提供了一套学术海报的PPT模板&#xff0c;适用于学术会议、研讨会等场合。 竖版&#xff0c;包含11…

机器学习之KNN算法预测数据和数据可视化

机器学习及KNN算法 目录 机器学习及KNN算法机器学习基本概念概念理解步骤为什么要学习机器学习需要准备的库 KNN算法概念算法导入常用距离公式算法优缺点优点&#xff1a;缺点︰ 数据可视化二维界面三维界面 KNeighborsClassifier 和KNeighborsRegressor理解查看KNeighborsRegr…

Jmeter自学【8】- 使用JMeter模拟设备通过MQTT发送数据

今天使用jmeter推送数据到MQTT&#xff0c;给大家分享一下操作流程。 一、安装JMeter 参考文档&#xff1a;Jmeter自学【1】- Jmeter安装、配置 二、安装MQTT插件 1、下载插件 我的Jmeter版本是5.6.3&#xff0c;用到的插件是&#xff1a;mqtt-xmeter-2.0.2-jar-with-depe…

若依框架中的上传图片后如何实现回显到页面的

在日常开发中&#xff0c;总会遇到上传文件、图片等功能&#xff0c;然后本地开发的话&#xff0c;又没有像OSS、七牛等网络存储&#xff0c;这个时候通常将文件上传到本地&#xff0c;那么上传之后拿到的是本地的路径&#xff0c;存储到数据库中&#xff0c;查询的时候如何将本…

Linux 文件 I/O 基础

目录 前言 一、文件描述符&#xff08;File Descriptor&#xff09; 二、打开文件&#xff08;open 函数&#xff09; 三、读取文件&#xff08;read 函数&#xff09; 四、写入文件&#xff08;write 函数&#xff09; 五、关闭文件&#xff08;close 函数&#xff09; …

【CSS in Depth 2 精译_091】15.4:让 CSS 高度值过渡到自动高度 + 15.5:自定义属性的过渡设置(全新)+ 15.6:本章小结

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第五部分 添加动效 ✔️【第 15 章 过渡】 ✔️ 15.1 状态间的由此及彼15.2 定时函数 15.2.1 定制贝塞尔曲线15.2.2 阶跃 15.3 非动画属性 15.3.1 不可添加动画效果的属性15.3.2 淡入与淡出 15.4 过…

路由器的原理

✍作者&#xff1a;柒烨带你飞 &#x1f4aa;格言&#xff1a;生活的情况越艰难&#xff0c;我越感到自己更坚强&#xff1b;我这个人走得很慢&#xff0c;但我从不后退。 &#x1f4dc;系列专栏&#xff1a;网路安全入门系列 目录 路由器的原理一&#xff0c;路由器基础及相关…

spring专题笔记(七):spring如何引入外部属性文件?spring在xml配置bean时如何引入外部的properties属性文件内容?

目录 1、spring在xml配置bean时引入外部的properties属性文件内容作用是什么&#xff1f; 2、引入配置文件步骤 2.1、首先创建一个java类MyDataSource&#xff0c;主要包含四个属性。 2.2、准备一个myDataConfig.properties属性文件&#xff0c;里面配置MyDataSource类中需…

梳理你的思路(从OOP到架构设计)_认识框架(Framework) 01

目录 1、 是框架的核心要素​编辑&i> 范例1&#xff1a; 范例2&#xff1a; 范例3&#xff1a; 1、 <E&I>是框架的核心要素 在特定领域(Domain)里&#xff0c;将EIT造形的<E&I>部份有意义地组合起来&#xff0c;就成为框架(Framework)了。基本…

邮件白名单是什么?

邮件白名单是一种电子邮件过滤规则&#xff0c;用于指定哪些发件人、域名或IP地址的邮件被允许通过过滤系统&#xff0c;不受任何限制地进入收件人的邮箱。与黑名单&#xff08;用于阻止特定发件人的邮件&#xff09;相反&#xff0c;白名单确保了来自受信任来源的邮件能够畅通…

Maven项目中不修改 pom.xml 状况下直接运行OpenRewrite的配方

在Java 的Maven项目中&#xff0c;可以在pom.xml 中配置插件用来运行OpenRewrite的Recipe&#xff0c;但是有一些场景是希望不修改pom.xml 文件就可以运行Recipe&#xff0c;比如&#xff1a; 因为不需要经常运行 OpenRewrite&#xff0c;所以不想在pom.xml 加入不常使用的插件…