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

axios请求拦截器和响应拦截器,封装naive-ui的 Loading Bar加载条和useMessage消息提示

接之前的博客设计从0开始边做边学,用vue和python做一个博客,非规范化项目,怎么简单怎么弄,跑的起来有啥毛病解决啥毛病(三),目前已经完成了基本的功能demo,但是请求接口不可能每个页面每个请求都写完整的axios请求,所以怎么把请求简单化,就涉及到的axios的封装了。

    • 开始封装axios
    • 请求拦截和消息提示
      • 请求拦截器
      • 响应拦截器
    • Loading Bar加载条和useMessage消息提示
      • 配置message这些的全局api
      • axios挂载加载条
      • axios挂载消息提示
      • 返回状态码

由原先页面中的请求:

axios.get('/api/article/' + id).then(function (response) {console.log(response);artcleinfo.content = response.data.data.contentartcleinfo.title = response.data.data.title}).catch(function (error) {console.log(error);});

变成这样:

getarticle(id).then(res=>{console.log(res)artcleinfo.content = res.data.contentartcleinfo.title = res.data.title
})

开始封装axios

首先在src下新建一个request文件夹用来存放请求等相关文件,然后文件夹下新建一个http.js 在这个文件中去把axios请求的一些公用逻辑封装到一起。

首先引入axios

import axios from 'axios'; // 引入axios

然后写一个get函数和post函数

export function get(url, params){return new Promise((resolve, reject) =>{axios.get(url, {params: params}).then(res => {resolve(res.data);}).catch(err =>{reject(err.data)})
})}export function post(url, params) {return new Promise((resolve, reject) => {axios.post(url,params).then(res => {resolve(res.data);}).catch(err =>{reject(err.data)})});
}

这个时候如果页面引入这个get请求也是可以正常请求的。

import get from '/src/request/http.js'get('/api/article/',1).then(res=>{console.log(res)
})

但是每个接口可能不止用一次,页面中这样写的话万一之后接口改了,每个页面还需要去找,去改,费时费力,所以就需要把接口全都放在一起去管理维护,然后页面中调用就好。
新建一个api.js文件在request目录下。

/// api.js
import { get, post } from './http'export const getarticle = (params) => {return get('/api/article', params)
}

然后页面中就可以直接使用封装的这个函数getarticle 进行数据的请求了。

getarticle(id).then(res=>{console.log(res)
})

这样就明朗多了

请求拦截和消息提示

虽然封装了请求,但是请求时会有一个请求和回复数据的时间问题,这个过程如果页面没有变化,那会不知道是否请求成功,是否开始请求,所以就涉及到发送请求之前对页面做些加载图标这些代表请求正在发送,然后请求回来的内容时候,页面提示请求成功或者失败或者异常信息等。

请求拦截器

axios有一个叫做请求拦截器的东西,就是每次发起请求之前可以写点东西放进去,然后每次请求之前都会执行一下,一般是请求之前判断token是否存在,或者请求的路径是否有权限等等

axios.interceptors.request.use(function (config) {// 在发送请求之前做些什么,加token头、请求路由权限判断、等等等等return config;},function (error) {// 请求错误时做些什么return Promise.reject(error);}
);

响应拦截器

既然请求之前可以拦截处理那么,请求成功回复的内容也可以进行拦截处理,把一些请求体内不需要的数据可以剔出去,然后只把data数据留到页面。在这个位置可以对返回来的数据的异常进行处理,比如请求回来的数据找不到数据404,没有权限403等等,再或者前后端有数据AES加密等等,只要是对返回数据进行统一操作的,都在这个响应拦截器中进行。

axios.interceptors.response.use(function (response) {// 对响应数据做些什么,比如数据解密、数据转码等等return response;},function (error) {// 对响应错误做些什么,比如400报错事后给页面个提示,登录失效跳转登录页面等等return Promise.reject(error);}
);

Loading Bar加载条和useMessage消息提示

在这里插入图片描述

请求既然可以拦截了,那么就用naiveui的Loading Bar加载条对请求的是否正常和异常进行显示一下
在这里插入图片描述
就这种在浏览器顶部一个条条,跟随者请求加载来变化。
然后请求结果是否成功或者异常会有一个文字的弹窗提醒来说明,这块用到naiveui的useMessage消息提示
在这里插入图片描述

该说不说这个NaiveUi的全局配置对比element复杂的不是亿点点。。。
但是弄明白了之后,也就那么回事。

配置message这些的全局api

先不用管官网说的那些杂七杂八,什么全局api什么的,直接新建一个message.vue
然后里面这样写,因为我不会Ts,就按Js这个写法能用就行。

<template><div></div>
</template>
<script setup>
import { createDiscreteApi } from 'naive-ui'const { message, notification, dialog, loadingBar } = createDiscreteApi(['message', 'dialog', 'notification', 'loadingBar']
)window.$message = message;
window.$notification = notification;
window.$dialog = dialog;
window.$loadingBar = loadingBar;</script>

然后第二步,根据官网说的需要把用到这些消息的内容框起来,那就直接把APP.VUE包起来

<script setup>
import message from "./components/message.vue";
</script>
<template><n-message-provider><RouterView /><message></message></n-message-provider>
</template>
<style>

这个n-message-provider是必须的东西,用这个包上才能用这个message,然后把咱们写的全局挂载message组件也放在这,就能实现全局使用这个消息提示了。

axios挂载加载条

// 请求拦截
axios.interceptors.request.use(config => {window.$loadingBar.start()return config;},error => {window.$loadingBar.error()return Promise.error(error);})// 响应拦截器
axios.interceptors.response.use(response => {window.$loadingBar.finish()return response.data;},error => {window.$loadingBar.error()return Promise.reject(error.response);})

axios挂载消息提示

// 响应拦截器
axios.interceptors.response.use(response => {window.$loadingBar.finish()window.$message.success('请求成功')return response.data;},error => {window.$loadingBar.error()window.$message.error('请求失败')return Promise.reject(error.response);})

目前这样就可以实现加载条和消息提示了
在这里插入图片描述

返回状态码

为了让不同的状态,显示不同的信息提示,所以在返回拦截中需要配置不同的状态码来返回内容
改进之后的返回拦截器:

// 响应拦截器
axios.interceptors.response.use(response => {window.$loadingBar.finish()window.$message.success('请求成功')return response.data;},error => {window.$loadingBar.error()window.$message.error('请求失败')if (error.response.status ) {switch (error.response.status) {case 401:window.$message.error('未登录')router.push('/login')break;case 403:window.$message.error('没有权限')break;case 404:window.$message.error('请求错误')break;case 500:window.$message.error('服务器内部错误')break;case 504:window.$message.error('网络错误')break;default:window.$message.error('未知错误')break;}}return Promise.reject(error.response);})

之后就是每个状态码对应的操作,比如我在这个401状态没登录的情况下去跳转到login页面进行登录等等操作。

相关文章:

axios请求拦截器和响应拦截器,封装naive-ui的 Loading Bar加载条和useMessage消息提示

接之前的博客设计从0开始边做边学&#xff0c;用vue和python做一个博客&#xff0c;非规范化项目&#xff0c;怎么简单怎么弄&#xff0c;跑的起来有啥毛病解决啥毛病&#xff08;三&#xff09;&#xff0c;目前已经完成了基本的功能demo&#xff0c;但是请求接口不可能每个页…...

9.Python 条件语句和循环语句

文章目录 Python 条件语句和循环语句1. **条件语句 (Conditional Statements)**1.1 if 语句1.2 if-else 语句1.3 if-elif-else 语句 2. **循环语句 (Loop Statements)**2.1 while 循环2.2 for 循环2.3 循环嵌套 (Nested Loops) 3. **控制循环的语句**3.1 break 语句3.2 continu…...

智能家居控制系统设计

设计智能家居控制系统是一个复杂但有趣的项目&#xff0c;它涉及硬件与软件的集成、网络通信、用户界面设计等多个方面。以下是一个智能家居控制系统的基本设计思路&#xff1a; 1. 需求分析- 功能需求&#xff1a;明确系统需要实现的功能&#xff0c;如灯光控制、空调温度调节…...

Windows系统word插入公式自动编号并交叉引用

一、定义新的多级列表 鼠标单击页面空白处 二、插入域 鼠标单击要插入公式编号的地方 三、交叉引用 鼠标单击要引用公式编号的地方 四、更新编号&#xff08;域&#xff09; CtrlA&#xff1a;全选全文 鼠标右键&#xff1a;更新域...

0.基础语法

文章目录 1. 第一个 Python 程序2. Python2.x 和 Python3.x 的差异3. 标识符和保留字符4. 行和缩进5. 多行语句6. 引号7. 注释8. 空行9. 用户输入10. Print 输出11. 代码组12. 命令行参数 Python 基础语法涵盖了从安装和运行 Python 程序到理解语言核心概念的各个方面。以下是基…...

mysql命令行界面(黑框)的登录

文章目录 开启关闭服务报错登录mysql退出mysql数据据database在电脑中的存放位置删除数据库语句 drop注意 cmd用管理员打开 开启关闭服务 报错 我有这个报错&#xff0c;但是使用没什么影响 登录mysql root替换成自己的用户名 退出mysql exit 数据据database在电脑中的…...

【机器学习】解构概率,重构世界:贝叶斯定理与智能世界的暗语

文章目录 条件概率与贝叶斯定理&#xff1a;深入理解机器学习中的概率关系前言一、条件概率与贝叶斯定理1.1 条件概率的定义与公式1.1.1 条件概率的定义1.1.2 条件概率的实例讲解 1.2 条件概率的性质与法则1.2.1 链式法则1.2.2 全概率公式1.2.3 贝叶斯定理的推导 1.3 贝叶斯定理…...

threejs——无人机概念切割效果

主要技术采用着色器的切割渲染,和之前写的风车可视化的文章不同,这次的切割效果是在着色器的基础上实现的,并新增了很多可调节的变量,兄弟们,走曲儿~ 线上演示地址,点击体验 源码下载地址,点击下载 正文 从图中大概可以看出以下信息,一个由线组成的无人机模型,一个由…...

electron学习笔记(一)

1.创建项目 mkdir myelectron npm init npm install --save-dev electron //安装通过以上命令&#xff0c; 我们就有了一个 electron 的项目 之后&#xff0c; 设置主文件入口 , 添加热启动 nodemon 2. nodemon 的使用和配置 要根目录下添加 nodemon.json 文件&#xff0c;配…...

基于Arduino蹲便器的自动清洁系统(论文+源码)

1系统整体设计 经过上述的方案分析&#xff0c;最终确定了Arduino UNO开发板为核心&#xff0c;结合蓝牙模块&#xff0c;舵机&#xff0c;电磁阀&#xff0c;红外传感器&#xff0c;步进电机&#xff0c;舵机等硬件设备来构成整个控制系统&#xff0c;整体框图如图2.1所示。其…...

【JavaWeb后端学习笔记】使用HttpClient发送Http请求

使用HttpClient发送Http请求需要在项目中导入相关依赖&#xff1a; <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</version> </dependency>1、 HttpClient…...

2024告别培训班 数通、安全、云计算、云服务、存储、软考等1000G资源分享

大类有&#xff1a;软考初级 软考中级 软考高级 华为认证 华三认证&#xff1a; 软考初级&#xff1a; 信息处理技术员 程序员 网络管理员 软考中级&#xff1a; 信息安全工程师 信息系统监理师 信息系统管理工程师 嵌入式系统设计时 数据库系统工程师 电子商务设…...

【C++】- 掌握STL List类:带你探索双向链表的魅力

文章目录 前言&#xff1a;一.list的介绍及使用1. list的介绍2. list的使用2.1 list的构造2.2 list iterator的使用2.3 list capacity2.4 list element access2.5 list modifiers2.6 list的迭代器失效 二.list的模拟实现1. list的节点2. list的成员变量3.list迭代器相关问题3.1…...

基于streamlit搭简易前端页面

前端小白第一次用streamlit搭简易页面&#xff0c;记录一下。 一些tips 每次与页面进行交互&#xff0c;如点击按钮、上传文件等&#xff0c;streamlit就会重新运行整个页面的所有代码。如果在页面渲染前需要对上传文件做很复杂的操作&#xff0c;重新运行所有代码就会重复这…...

Harmony Next开发通过bindSheet绑定半模态窗口

示例概述 Harmony Next开发通过bindSheet绑定半模态窗口 知识点 半模态窗口父子组件传值 组件 LoginComponent Component struct LoginComponent {// Prop 父子单项绑定值Prop message:string // Link 父子双向绑定值Link userName:stringLink password:stringLink isSh…...

YOLOv11改进,YOLOv11添加DLKA-Attention可变形大核注意力,WACV2024 ,二次创新C3k2结构

摘要 作者引入了一种称为可变形大核注意力 (D-LKA Attention) 的新方法来增强医学图像分割。这种方法使用大型卷积内核有效地捕获体积上下文,避免了过多的计算需求。D-LKA Attention 还受益于可变形卷积,以适应不同的数据模式。 理论介绍 大核卷积(Large Kernel Convolu…...

【51单片机】矩阵按键快速上手

51单片机矩阵按键是一种在单片机应用系统中广泛使用的按键排列方式&#xff0c;特别适用于需要多个按键但I/O口资源有限的情况。以下是对51单片机矩阵按键的详细介绍&#xff1a; 一、矩阵按键的基本概念 ‌定义‌&#xff1a;矩阵按键&#xff0c;又称行列键盘&#xff0c;是…...

一文说清:git reset HEAD原理

1 使用add命令&#xff0c;将文件添加到暂存区 命令如下&#xff1a; 对比结果如下&#xff1a; 2 使用reset HEAD命令 如下&#xff1a; 结果对比如下&#xff1a; 忽略logs目录下的内容。 发现只是修改了index暂存区的内容。删掉了原来添加到暂存区的对象ID&#x…...

【前端面试题】书、定位问题、困难

看过什么书 《JavaScript 高级程序设计&#xff08;第 4 版&#xff09;》&#xff08;作者&#xff1a;Matt Frisbie&#xff09; 这是一本深入学习 JavaScript 语言的经典书籍。它详细地涵盖了 JavaScript 的高级特性&#xff0c;包括原型链、闭包、异步编程等复杂概念。以闭…...

WADesk 升级 Webpack5 一些技术细节认识5和4的区别在哪里

背景 升级过程中发现有很多新的知识点&#xff0c;虽然未来可能永远都不会再遇到&#xff0c;但是仍然是一次学习的好机会&#xff0c;可以让自己知道&#xff0c;打包软件的进化之路&#xff0c;和原来 Webpack 4 版本的差异在哪里。 移除的依赖记录 babel/register: 在 Nod…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

使用ch340继电器完成随机断电测试

前言 如图所示是市面上常见的OTA压测继电器&#xff0c;通过ch340串口模块完成对继电器的分路控制&#xff0c;这里我编写了一个脚本方便对4路继电器的控制&#xff0c;可以设置开启时间&#xff0c;关闭时间&#xff0c;复位等功能 软件界面 在设备管理器查看串口号后&…...

零基础在实践中学习网络安全-皮卡丘靶场(第十一期-目录遍历模块)

经过前面几期的内容我们学习了很多网络安全的知识&#xff0c;而这期内容就涉及到了前面的第六期-RCE模块&#xff0c;第七期-File inclusion模块&#xff0c;第八期-Unsafe Filedownload模块。 什么是"遍历"呢&#xff1a;对学过一些开发语言的朋友来说应该知道&…...

解密鸿蒙系统的隐私护城河:从权限动态管控到生物数据加密的全链路防护

摘要 本文以健康管理应用为例&#xff0c;展示鸿蒙系统如何通过细粒度权限控制、动态权限授予、数据隔离和加密存储四大核心机制&#xff0c;实现复杂场景下的用户隐私保护。我们将通过完整的权限请求流程和敏感数据处理代码&#xff0c;演示鸿蒙系统如何平衡功能需求与隐私安…...

uni-app学习笔记二十七--设置底部菜单TabBar的样式

官方文档地址&#xff1a;uni.setTabBarItem(OBJECT) | uni-app官网 uni.setTabBarItem(OBJECT) 动态设置 tabBar 某一项的内容&#xff0c;通常写在项目的App.vue的onLaunch方法中&#xff0c;用于项目启动时立即执行 重要参数&#xff1a; indexnumber是tabBar 的哪一项&…...