前端学习 vben 之 axios interceptors

interceptor

拦截器,是一种软件设计模式,核心思想就是在程序执行的特定阶段(如请求发送前,响应返回后,方法调用前后等)自动插入自定义逻辑。实现对核心流程的“拦截”和增强。它本质上是一种面向切面编程(AOP) 的具体实现,用于解耦横跨多个模块的通用功能(如日志、认证、错误处理)。

axios 中的 interceptor

axios 中实现了 interceptor,可以在发送请求前拦截请求,对请求进行一些处理,比如添加 token,添加请求头等。
在响应返回之后,也可以对响应进行一些处理,比如将响应数据转换成 json 对象,或者处理错误等。

vben 中的 axios 的 interceptor

vben 中预设了三个拦截器,文件地址packages\effects\request\src\request-client\preset-interceptors.ts

请求拦截器

请求拦截器,只写了一些设置请求头 token 的逻辑,和客户端所偏好的自然语言。

config => {const accessStore = useAccessStore();config.headers.Authorization = formatToken(accessStore.accessToken);config.headers["Accept-Language"] = preferences.app.locale;return config;
};

响应拦截器

defaultResponseInterceptor

首先,我们要知道什么时候会触发 axios 请求成功的响应拦截器。

  // `validateStatus` 定义了对于给定的 HTTP状态码是 resolve 还是 reject promise。// 如果 `validateStatus` 返回 `true` (或者设置为 `null` 或 `undefined`),// 则promise 将会 resolved,否则是 rejected。validateStatus: function (status) {return status >= 200 && status < 300; // 默认值},

可知,当 http status 为 200-300 之间时,才会触发请求响应的成功拦截器。

让我们看一下 axios 响应数据的格式

{// `data` 由服务器提供的响应"data": {},// `status` 来自服务器响应的 HTTP 状态码"status": 200,// `statusText` 来自服务器响应的 HTTP 状态信息"statusText": "OK",// `headers` 是服务器响应头// 所有的 header 名称都是小写,而且可以使用方括号语法访问// 例如: `response.headers['content-type']`"headers": {},// `config` 是 `axios` 请求的配置信息"config": {},// `request` 是生成此响应的请求// 在node.js中它是最后一个ClientRequest实例 (in redirects),// 在浏览器中则是 XMLHttpRequest 实例"request": {}
}

下面是defaultResponseInterceptor简化代码

type defaultResponseInterceptor = ({codeField,dataField,successCode,
}: {// 响应数据中,结果的字段名,用来判断请求是否成功codeField: string;// 响应数据中,结果数据字段名,或者自定义解析dataField: ((response: any) => any) | string;// 响应数据中,自定义响应成功的codesuccessCode: ((code: any) => boolean) | number | string;
}) => {fulfilled;
};

执行defaultResponseInterceptor 返回一个对象,有 fulfilled 方法。

dataField

这个是用来指定返回 data 中实际需要的数据字段。

// raw ,body , data
config.responseReturn === "body";

在请求的 config 中,vben 自定义添加了responseReturn字段,取值有三种,

  1. raw:返回原始数据
  2. body:返回 data 字段
  3. data:返回 data 字段中的数据
codeField

codeField 是指 上面 data 中的 code 字段。一般情况下,公司拥有自己一套请求成功还是失败的一个判断,基本都与业务相关联。比如请求字段缺少,请求字段不合法等等,还有与业务相关的情况,比如订单生成失败的 code 等。

successCode

用来判断响应的数据,是请求成功的,还是请求失败。

在 vben 中的 config,一般使用的是responseReturn = "data"。所以在页面使用的时候,请求函数中最终得到的响应结果是 data 字段中的数据。

errorMessageResponseInterceptor
type errorMessageResponseInterceptor = (makeErrorMessage: (message: string, error: any) => void) => { rejected };

调用makeErrorMessage方法,返回一个对象,对象中有 rejected 方法。
makeErrorMessage 方法中,处理了取消请求,请求超时,以及其他服务器返回的错误情况。如果对于请求成功,但是业务错误的情况,可以在请求成功响应拦截器中进行throw new Error(resp),然后通过makeErrorMessage,自定义处理这中情况。

export const defaultResponseInterceptor = ({codeField = "code",dataField = "data",successCode = 0,
}: {/** 响应数据中代表访问结果的字段名 */codeField: string;/** 响应数据中装载实际数据的字段名,或者提供一个函数从响应数据中解析需要返回的数据 */dataField: ((response: any) => any) | string;/** 当codeField所指定的字段值与successCode相同时,代表接口访问成功。如果提供一个函数,则返回true代表接口访问成功 */successCode: ((code: any) => boolean) | number | string;
}): ResponseInterceptorConfig => {return {fulfilled: response => {const { config, data: responseData, status } = response;if (config.responseReturn === "raw") {return response;}if (status >= 200 && status < 400) {if (config.responseReturn === "body") {return responseData;} else if (isFunction(successCode) ? successCode(responseData[codeField]) : responseData[codeField] === successCode) {return isFunction(dataField) ? dataField(responseData) : responseData[dataField];}}throw Object.assign({}, response, { response });},};
};export const errorMessageResponseInterceptor = (makeErrorMessage?: MakeErrorMessageFn): ResponseInterceptorConfig => {return {rejected: (error: any) => {if (axios.isCancel(error)) {return Promise.reject(error);}const err: string = error?.toString?.() ?? "";let errMsg = "";if (err?.includes("Network Error")) {errMsg = $t("ui.fallback.http.networkError");} else if (error?.message?.includes?.("timeout")) {errMsg = $t("ui.fallback.http.requestTimeout");}if (errMsg) {makeErrorMessage?.(errMsg, error);return Promise.reject(error);}let errorMessage = "";const status = error?.response?.status;switch (status) {case 400: {errorMessage = $t("ui.fallback.http.badRequest");break;}case 401: {errorMessage = $t("ui.fallback.http.unauthorized");break;}case 403: {errorMessage = $t("ui.fallback.http.forbidden");break;}case 404: {errorMessage = $t("ui.fallback.http.notFound");break;}case 408: {errorMessage = $t("ui.fallback.http.requestTimeout");break;}default: {errorMessage = $t("ui.fallback.http.internalServerError");}}makeErrorMessage?.(errorMessage, error);return Promise.reject(error);},};
};

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

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

相关文章

【java面试day4】redis缓存-数据持久化

文章目录问题&#x1f4ac; Question 1相关知识问题 &#x1f4ac; Question 1 Q&#xff1a;redis作为缓存&#xff0c;数据的持久化是怎么做的? A&#xff1a;有两种机制&#xff0c;一种是RDB&#xff0c;RDB会在指定的时间间隔内将内存中的数据生成快照&#xff0c;保存…

Vue3中element plus默认获取最近一周和上个月的时间区间并在后端分开传值

<el-form-item label"结算时间&#xff1a;" prop"datetimerangevalue"><el-date-pickerv-model"datetimerangevalue"value-format"YYYY-MM-DD HH:mm:ss"type"datetimerange"range-separator"至"start-p…

SQLAlchemy数据库连接密码特殊字符处理完全指南

引言 在使用SQLAlchemy连接数据库时&#xff0c;我们通常使用URL格式指定连接信息&#xff0c;如mysqlpymysql://user:passwordhost:port/database。然而&#xff0c;当密码中包含特殊字符&#xff08;如、#、$、!等&#xff09;时&#xff0c;会导致URL解析错误&#xff0c;进…

1.4 ARM安全参考架构(PSA Certified)

目录1.4.1 PSA Certified概述1.4.2 PSA认证级别详解1.4.3 PSA与TF-A的关系1.4.4 PSA安全模型实现信任根(RoT)架构关键安全服务&#xff1a;1.4.5 认证流程实践1.4.6 典型应用案例参考资料1.4.1 PSA Certified概述 ARM Platform Security Architecture (PSA) Certified 是一套完…

企业网络安全的“金字塔”策略:构建全方位防护体系的核心思路

在数字化转型的浪潮中&#xff0c;企业的网络安全已从单一的防护措施&#xff0c;发展成为多层次、全方位的安全体系。如何精准应对日益复杂的网络威胁&#xff0c;成为众多企业关注的焦点。本文将分享企业构建高效安全防护“金字塔”的核心思路。一、从“排查隐患”到“主动防…

爬虫-request模块使用

1.使用和安装2.代码测试打印返回的内容&#xff0c;默认是请求体中的标识.text 是打印源代码设置一下编码

HTML + CSS + JavaScript

目录 1 HTML HTML 文件基本结构 HTML 开发工具 HTML 常见标签 标题标签&#xff1a;h1 - h6 段落标签&#xff1a;p 换行标签&#xff1a;br 图片标签&#xff1a;img 超链接标签&#xff1a;a 表格标签 表单标签 form 标签 input 标签 select 标签 textarea 标…

Java 与 MySQL 性能优化:MySQL连接池参数优化与性能提升

文章目录引言一、连接池的基本概念与作用二、关键连接参数详解2.1 max_connections2.2 wait_timeout2.3 interactive_timeout2.4 connect_timeout2.5 thread_cache_size三、连接池参数不合理导致的性能问题3.1 连接耗尽3.2 响应变慢3.3 连接失效3.4 资源浪费四、连接池参数优化…

浪潮CD1000-移动云电脑-RK3528芯片-2+32G-开启ADB ROOT破解教程

浪潮CD1000-移动云电脑-RK3528芯片-232G-安卓9-开启ADB ROOT破解教程破解教程&#xff1a;1.先下载好开心电视助手&#xff08;下载地址及其他版本&#xff1a;【工具大全】-【开心电视助手3.8&#xff0f;4.0&#xff0f;4.6&#xff0f;6.0&#xff0f;6.2&#xff0f;6.3&am…

【网络编程】简易的 p2p 模型,实现两台虚拟机之间的简单点对点通信,并以小见大观察 TCP 协议的具体运行

文章目录基本概念业务拆解代码实现准备工作实现被动的功能——多线程指针函数实现主动的功能——用户选择界面主函数代码执行效果意外收获总结推荐一个零声教育学习教程&#xff0c;个人觉得老师讲得不错&#xff0c;分享给大家&#xff1a;[Linux&#xff0c;Nginx&#xff0c…

react状态管理库 - zustand

什么是zustand&#xff1f; zustand 是一个轻量级、快速且可扩展的 React 状态管理库&#xff0c;旨在提供一种简单直接的方式来管理应用状态&#xff0c;而无需其他解决方案通常伴随的繁琐代码。根据官方 Zustand 文档&#xff0c;Zustand 是“一个使用简化 flux 原理的小型、…

粗排样本架构升级:融合LTR特征提升模型性能的技术实践

粗排样本架构升级&#xff1a;融合LTR特征提升模型性能的技术实践 ——基于PySpark的样本构建与特征工程深度解析 一、粗排系统的定位与技术演进 在推荐系统级联架构中&#xff0c;​粗排&#xff08;Rough Ranking&#xff09;​​ 承担着关键过渡角色&#xff1a;从召回层获…

CCF-GESP 等级考试 2025年6月认证C++四级真题解析

1 单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09;第1题 在C中&#xff0c;声明一个指向整型变量的指针的正确语法是&#xff08; &#xff09;。A. int* ptr; B. *int ptr; C. int ptr*; D. ptr …

PlantUML 在 IDEA 中文版中的安装与使用指南

目录 摘要 一、安装 PlantUML 插件 二、配置 PlantUML 运行环境 三、创建 PlantUML 文件 四、编写 PlantUML 代码 五、生成并查看图表 六、自动生成类图&#xff08;重点新增&#xff09; 6.1 从 Java 类生成类图 6.2 类图语法详解 6.3 类图高级技巧 七、常见问题及…

创客匠人:创始人 IP 打造中 “放下身段” 的深层逻辑

在 IP 经济火热的当下&#xff0c;无数创始人投身 IP 打造&#xff0c;却鲜少有人意识到&#xff1a;真正能实现 IP 变现的核心&#xff0c;并非专业知识的堆砌&#xff0c;而是与用户建立 “可交往” 的连接。创客匠人通过多年服务 IP 的实践发现&#xff0c;那些穿越周期的创…

C语言<数据结构-链表>

链表是一种常见且重要的数据结构&#xff0c;在 C 语言中&#xff0c;它通过指针将一系列的节点连接起来&#xff0c;每个节点可以存储不同类型的数据。相比数组&#xff0c;链表在插入和删除元素时不需要移动大量数据&#xff0c;具有更好的灵活性&#xff0c;尤其适合处理动态…

基于Matlab多特征融合的可视化指纹识别系统

针对中小规模&#xff08;百级&#xff09;指纹模板库中常见的脊线断裂、噪声干扰以及结果缺乏可解释性等难点&#xff0c;本文提出并实现了一种基于多特征融合的可视化指纹识别系统。系统整体采用模块化设计&#xff1a;在预处理阶段&#xff0c;先通过改进的灰度归一化与局部…

50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | DoubleVerticalSlider(双垂直滑块)

&#x1f4c5; 我们继续 50 个小项目挑战&#xff01;—— DoubleVerticalSlider组件 仓库地址&#xff1a;https://github.com/SunACong/50-vue-projects 项目预览地址&#xff1a;https://50-vue-projects.vercel.app/ 使用 Vue 3 的 Composition API&#xff08;<scrip…

mysql join语句、全表扫描 执行优化与访问冷数据对内存命中率的影响

文章目录join执行逻辑Index Nested_Loop Join&#xff08;NLJ&#xff09;MMR(Mutli-Range Read) 优化BKA(Batched Key Access)算法Simple Nested_Loop JoinBlock Nested-Loop Join&#xff08;BLJ&#xff09;join buffer 一次放不下 驱动表join buffer优化的影响&#xff1a;…

【LeetCode100】--- 1.两数之和【复习回滚】

题目传送门 解法一&#xff1a;暴力枚举&#xff08;也是最容易想到的&#xff09; class Solution {public int[] twoSum(int[] nums, int target) {int n nums.length;for(int i 0; i < n; i){for(int j i1; j<n; j){if(nums[i] nums[j] target){return new int…