Vue3项目基于Axios封装request请求

        在 Vue 3 的项目开发中,使用 Axios 进行 HTTP 请求是非常常见的作法,为了更方便开发者更高效的进行代码编写和项目的维护,可以通过再次封装 Axios 来实现。

        在本文中,博主将详细指导你如何在自己的 Vue 3 项目中使用 Axios 二次封装 request 请求。

1.安装 Axios

        首先,确保我们的 Vue 3 项目已经安装了 Axios 。

如果尚未安装 Axios ,则可以定位到项目根目录下 (与src目录同级) ,运行命令行:

# 使用 npm 包管理器
npm install axios


# 使用 yarn 包管理器
npm add axios


# 使用 pnpm 包管理器
pnpm install axios

         随后,我们查看 package.json 配置文件中是否包含了 Axios 的配置信息:7090cc72391a41c08d1f35a4d996d456.png

 2.创建请求封装模块

        在项目中创建一个单独的模块用来封装 Axios 请求。(博主这里是 src/utils/request.ts)

第一步:创建一个新的 Axios 实例

/* request.ts  这里博主用的是 TypeScript */

// 引入 Axios 库的功能,AxiosInstance 是 Axios 中自带的接口类型
import axios, { AxiosInstance } from 'axios';
import { ElMessage, ElMessageBox } from 'element-plus';      // 按需引入 Element-Plus 组件

// 第一步:创建一个新的 Axios 实例
const service: AxiosInstance = axios.create({
    // 这里博主直接引用了开发环境配置文件中的路径, 也可自定义成网络地址
    baseURL: import.meta.env.VITE_API_URL,  // 或 http://${host}:${port}
    timeout: 5000,  // 设置请求超时,一般来说为 5 秒
    // 设置请求头类型:若非文件传输,一般情况下为 json
    headers: { 'Content-Type': 'application/json' },  // 传输文件: multipart/form-data
    /* 自定义 Axios 的参数序列化过程
     * paramsSerializer 是 Axios 中的一个配置项,用于定义在发送 GET 请求时如何序列化 URL 参数
     * serialize 是一个自定义的方法,它接收一个 params 对象作为参数,并返回一个字符串
     * 在这里,它使用了 qs(可能是 querystring 库)来将参数对象 params 序列化为一个 URL 查询字符串
     * 这里的 qs.stringify 函数是一个用于序列化对象为 URL 查询字符串的方法
     */
    paramsSerializer: {
		serialize(params) {
			return qs.stringify(params, { allowDots: true });
		}
	}
})

第二步:创建请求拦截器

// request.ts 文件中

/*
 * 已经完成了第一步
 */

// 第二步:创建请求拦截器
service.interceptors.request.use(
    (config) => {
        // 这里可以在我们发送 request 网络请求前,为我们的 request 请求做一些配置
        // 例如:将 token 携带在请求头中
        config.headers!['Authorization'] = `Token ${Session.get('token')}`;
        
        return config
    },
    (error) => {
        // 错误调试
        return Promise.reject(error)
    }
)

 第三步:创建响应拦截器

/* request.ts 文件中 */

/*
 * 已完成第一步
 *
 * 已完成第二步
 */

// 第三步:创建请求拦截器
service.interceptors.response.use(
    (response) => {
        // 在这里,你可以对从后端拿到的数据进行处理
        const res = response.data;

        if (res.code === 400 || res.code === 401 || res.code === 403) {
            // 如果没有权限,可以清除浏览器中缓存的 session 信息
            Session.clear(); // 清除浏览器全部临时缓存
			window.location.href = '/'; // 去登录页
			ElMessageBox.alert('你已被登出,请重新登录', '提示', {})
				.then(() => { })
				.catch(() => { });

			return Promise.reject(service.interceptors.response);
        } else {
            
            return res;
        }
    },
    (error) => {
        // 对响应错误做点什么
		if (error.message.indexOf('timeout') != -1) {
			ElMessage.error('网络超时');
		} else if (error.message == 'Network Error') {
			ElMessage.error('网络连接错误');
		} else {
			if (error.response.data) ElMessage.error(error.response.statusText);
			else ElMessage.error('接口路径找不到');
		}
		return Promise.reject(error);
    }
)

 第四步:导出 Axios 实例

/* request.ts 文件中 */

/*
 * 已完成了上述三个步骤
 */

// 导出 axios 实例
export default service;

完整代码如下:

import axios, { AxiosInstance } from 'axios';
import { ElMessage, ElMessageBox } from 'element-plus';
import { Session } from '/@/utils/storage';
import qs from 'qs';

// 配置新建一个 axios 实例
const service: AxiosInstance = axios.create({
	baseURL: import.meta.env.VITE_API_URL,
	timeout: 50000,
	headers: { 'Content-Type': 'multipart/form-data' },
	paramsSerializer: {
		serialize(params) {
			return qs.stringify(params, { allowDots: true });
		},
	},
});

// 添加请求拦截器
service.interceptors.request.use(
	(config) => {
		// 在发送请求之前做些什么 token
		if (Session.get('token')) {
			config.headers!['Authorization'] = `DavyJonesZ ${Session.get('token')}`;
		}
		return config;
	},
	(error) => {
		// 对请求错误做些什么
		return Promise.reject(error);
	}
);

// 添加响应拦截器
service.interceptors.response.use(
	(response) => {
		// 对响应数据做点什么
		const res = response.data;

		if (res.code && res.code !== 0) {
			// `token` 过期或者账号已在别处登录
			if (res.code === 401 || res.code === 4001) {
				Session.clear(); // 清除浏览器全部临时缓存
				window.location.href = '/'; // 去登录页
				ElMessageBox.alert('你已被登出,请重新登录', '提示', {})
					.then(() => { })
					.catch(() => { });
				return Promise.reject(service.interceptors.response);
			} else {

				return res;
			}

		} else {

			return res;
		}
	},
	(error) => {
		// 对响应错误做点什么
		if (error.message.indexOf('timeout') != -1) {
			ElMessage.error('网络超时');
		} else if (error.message == 'Network Error') {
			ElMessage.error('网络连接错误');
		} else {
			if (error.response.data) ElMessage.error(error.response.statusText);
			else ElMessage.error('接口路径找不到');
		}
		return Promise.reject(error);
	}
);

// 导出 axios 实例
export default service;

3. 使用

        完成上述对于 Axios 的二次封装后,我们就可以在其他地方进行调用了

/* Vue 3 接口工具类:login.ts 文件中 */
import request from '/@/utils/request';

// Login Api
export function login(data: object) {
    return request({
        url: '/user/login',
        method: 'POST',
        data
    })
}

        最后,只需要在Vue组件中,引入 login.ts 文件,并调用其 login 方法,就可以实现与后端接口的通信啦!(大功告成!!!)

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue学习---vue cli 项目创建

使用的编辑工具webStorm 创建例子: hello vue create hello 选择 vue3 进行创建 运行 npm run serve 测试访问:http://localhost:8080 改动内容重新编译: npm run build dist 目录就是编译后的可运行内容

客流统计系统优化景区服务流程,增强游客满意度

在当今旅游业蓬勃发展的时代,景区面临着越来越多的挑战和机遇。如何提供更优质、更高效的服务,满足游客日益增长的需求,成为了景区管理者们关注的焦点。客流统计系统作为一种创新的技术手段,正逐渐成为优化景区服务流程、增强游客…

windows 打包pyd文件

1.新建一个py文件,myunit.py,里面的代码是: class Adder: def __init__(self, a, b): self.a a self.b b def add(self): return self.a self.b 2.新建一个py文件,setup.py,里面的代码是: from setuptools import setup fro…

巧用通义灵码助力护网面试

前言 前几年护网还算是一个比较敏感的话题,但是随着近段时间的常态化开始,护网行动也是逐渐走进了大众的视野,成为了社会各界共同关注的安全盛事。本篇也是受通义灵码备战求职季活动的启发,结合近期要开始的护网行动&#xff0c…

持续集成06--Jenkins构建触发器

前言 在持续集成(CI)的实践中,构建触发器是自动化流程中不可或缺的一环。它决定了何时启动构建过程,从而确保代码变更能够及时地得到验证和反馈。Jenkins,作为业界领先的CI/CD工具,提供了多种构建触发器选项…

2.I/O口

I/O输出(点灯) 分析电路 看电路图&#xff0c;元器件形成电压差&#xff0c;即可点亮LED灯 代码编写 使用不同操作进行LED控制 #include "reg52.h" //51单片机头文件 #include <intrins.h> sbit LED1 P1^0; //引脚初始化&#xff1a;P1^0&#xff1a;对应引脚…

RocketMQ~架构与工作流程了解

简介 RocketMQ 具有高性能、高可靠、高实时、分布式 的特点。它是一个采用 Java 语言开发的分布式的消息系统&#xff0c;由阿里巴巴团队开发&#xff0c;在 2016 年底贡献给 Apache&#xff0c;成为了 Apache 的一个顶级项目。 在阿里内部&#xff0c;RocketMQ 很好地服务了集…

字符串类中的常用方法

1 string对象的创建 静态创建 String s1  "abc";  String s2  "abc";  动态创建 String s3  new String("abc"); String s4  new String("abc"); 2string对象的不可变性 任何一个String对象在创建之后都不能对它的…

甲方建设项目的数智化管理

在军工、石化、电力、民航、食品等大型集团企业和政府机构中&#xff0c;基建、IT、技改等各类固定投资项目属于甲方建设型项目。这类项目无论是EPC总包还是按合同分包&#xff0c;都具有业主型、项目干系人多、跨组织协作频繁、全生命周期管理复杂等特点。如何高效地管理这些甲…

基于LAMMPS模拟岩石表面润湿性

润湿性是指不相混的两相流体与岩石固相表面接触时&#xff0c;其中一相流体沿着岩石表面铺开的现象&#xff0c;该相称为润湿相。润湿性一般采用接触角法来确定&#xff0c;通常根据水在固体表面的角度θ来定义系统的润湿性&#xff0c;接触角为0&#xff5e;75为水润湿&#x…

gihub导入gitee仓库实现仓库同步

昨天在GitHub里导入了gitee仓库&#xff0c;但是在仓库同步这里卡了很久&#xff0c;因为网上大多数都是从github导入gitee&#xff0c;然后github生成token放入实现同步&#xff0c;但是我找到一种更为方便的&#xff01; 1.首先找到项目文件下的.git文件里的config文件 2.在…

C++ | Leetcode C++题解之第238题除自身以外数组的乘积

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> productExceptSelf(vector<int>& nums) {int length nums.size();// L 和 R 分别表示左右两侧的乘积列表vector<int> L(length, 0), R(length, 0);vector<int> answer(l…

求解答word图标变白

把WPS卸载了之后就变成白色了&#xff0c;然后在注册表中把word的地址改成office word的地址之后图标变成这样了&#xff0c;怎么办

在国产芯片上实现YOLOv5/v8图像AI识别-专栏目录及必备知识点及相关设备

本专栏主要是提供一种国产化图像识别的解决方案&#xff0c;专栏中实现了YOLOv5/v8在国产化芯片上的使用部署&#xff0c;并可以实现网页端实时查看。根据自己的具体需求可以直接产品化部署使用。 学习本专栏内容需要准备以下硬件设备&#xff1a; 1、RK3588开发板 2、带有 显…

《藏语翻译通》App功能升级,支持藏文词典在线查单词!iPhone用户推荐使用的藏语学习工具!

《藏语翻译通》App上线了藏文词典查单词功能&#xff0c;该功能可以帮助你更有效地学习藏语&#xff0c;以及掌握工作中涉及到的专业术语。本次更新提供了藏汉词典、藏汉大词典、新术语在线查单词功能。 打开App Store搜索关键词&#xff1a;藏文词典 下载这个官方软件 点击首…

leetcode94. 二叉树的中序遍历,递归法+迭代法。附带前序遍历方法

leetcode94. 二叉树的中序遍历 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2] 示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[] 示例 3&#xff1a; …

<数据集>猫狗识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;3686张 标注数量(xml文件个数)&#xff1a;3686 标注数量(txt文件个数)&#xff1a;3686 标注类别数&#xff1a;2 标注类别名称&#xff1a;[cat, dog] 序号类别名称图片数框数1cat118811892dog24982498 使用标…

揭秘物联网“心脏“:智能控制器的无限可能

在飞速发展的物联网时代&#xff0c;我们身边的智能设备越来越多&#xff0c;从智能家居到工业自动化&#xff0c;从智能交通到智慧城市&#xff0c;这些设备的背后&#xff0c;都离不开一个至关重要的“心脏”——物联网智能控制器。那么&#xff0c;这个神秘的控制器究竟有何…

计算机网络——网络层(IP地址与MAC地址、地址解析协议ARP、IP数据报格式以及转发分组、ICMP、IPV6)

IP地址与MAC地址 由于MAC地址已固化在网卡上的ROM 中&#xff0c;因此常常将 MAC地址称为硬件地址或物理地址&#xff1b;物理地址的反义词就是虚拟地址、软件地址或逻辑地址&#xff0c;IP地址就属于这类地址。 从层次的角度看&#xff0c;MAC地址是数据链路层使用的地址&…

前端开发体系+html文件详解

目录 html骨架 body主体内基本元素 基本元素 超文本&#xff08;超链接跳转&#xff09; 锚点 图片标签 列表标签 表格标签 框架标签&#xff08;窗口标签&#xff09; 音频标签 视频标签 VScode编译器 输入框 字体样式 实例展示&#xff1a; 首先简要介绍前端的整…