umi-request全局响应拦截器

news2025/1/10 16:06:16

文章目录

  • 介绍
  • 思路
  • 实现
    • 方法1.直接修改 umi-request
    • 方法2.自定义 request 实例,通过 umi-request 库进行配置

介绍

后端设计统一返回比如BaseResponse对象,前端也需要接收这个对象,从data取出想要的返回值。
在这里插入图片描述

前端请求比如之前返回的是number类型:
在这里插入图片描述
当返回参数类型变成BaseResponse,代码也需要更改:
在这里插入图片描述
很多请求方法都需要修改,一一修改不仅麻烦还可能容易漏改。因此我们同样可以整一个全局响应拦截器先来处理返回的BaseResponse,如果请求返回成功则取出data返回,如果请求返回失败则直接抛出一个异常外部进行catch,这样我们的请求仍然可以按照之前的写法无需更改。

思路

查看源码:request 里面的 RequestConfig 接口有 responseInterceptors 参数即响应拦截器,
在这里插入图片描述
这里创建了类型为 RequestConfigconfig变量,
在这里插入图片描述
然后根据 config 变量设置request
在这里插入图片描述
因此这里我们尝试在config配置responseInterceptors
通过追溯源码定义 responseInterceptors
在这里插入图片描述在这里插入图片描述
直接抄:发送请求打印响应
在这里插入图片描述

在这里插入图片描述
目测还算成功,起码拦截到了。但是有一个问题:我在源码里修改代码,而这个文件位于 .umi 目录,这个目录是框架生成的,每次重新启动项目这个文件就会恢复原样(相当于白改),因此我们不能在这儿改。
在这里插入图片描述

实现

方法1.直接修改 umi-request

直接在app.tsx全局入口文件中,配置全局的request,编写自己的响应处理逻辑。请求返回成功使用resolve方法;请求返回失败使用reject方法,外部方法用try catch捕获,可参考上面的注册方法。

export const request: RequestConfig = {
  baseURL: '/api',
  timeout: 30000,
  // 自定义全局响应拦截器
  responseInterceptors: [
    // @ts-ignore
    function <T extends AxiosResponse<T, any> = any>(response: AxiosResponse<T>): WithPromise<AxiosResponse<T>> {
      console.log('全局响应拦截器', response);
      console.log('全局响应拦截器', response.data);
      if (response.data.code === 0){
        return Promise.resolve(response.data);
      }
      if (response.data.code === 40100) {
        message.error('请先登录');
        history.replace({
          pathname: '/user/login',
          search: stringify({
            redirect: location.pathname,
          }),
        });
        return Promise.reject(new Error('未登录'));
      } else {
        console.log('全局响应拦截器', response.data.description);
        // @ts-ignore
        return Promise.reject(new Error(response.data.description || '请求出错'));
      }
    }
  ]
};

注:这里返回响应的时候看着点,别返回错了!!!!!!!!!!!!!!!!
可参考下面的request源码:
我们可以看到 request 最终返回的是一个 Promise 对象,使用 resolve方法的时候返回的是 res.data
在这里插入图片描述在这里插入图片描述

可配合请求打印响应拦截器的 response 输出日志:
最初的response没有做任何处理响应状态码200。response.data其实就是后端统一封装的返回对象比如BaseResponse。
在这里插入图片描述

=========================================================================================
因此这里自定义的全局响应拦截器返回的应该是response.data,而不是response.data.data,因为request最终返回的是Promise对象,返回的是上面的 res.data。简而言之就是人家帮我们取了一层 data 属性,我们返回他的上一级即可,不然取到的可能是undefined(别问我怎么知道的呜呜呜,不看源码一辈都不知道,后来想想也不难理解了,正常我们一般请求返回的响应直接拿到了结果,其实就是取的原始的response.data)。

在这里插入图片描述
//这里返回什么也不是绝对的,自定义拦截器的内部逻辑还是要看自己怎么设计的

方法2.自定义 request 实例,通过 umi-request 库进行配置

import {extend, RequestMethod} from 'umi-request';
import {message} from "antd";
import {history} from "@@/core/history";
import {stringify} from "querystring";

/**
 * 配置request请求时的默认参数
 */
const request: RequestMethod<true> = extend({
  credentials: 'include', // 默认请求是否带上cookie
  prefix: process.env.NODE_ENV === 'production' ? 'TODO' : 'http://localhost:8000/api',
});

/**
 * 所有请求拦截器
 */
request.interceptors.request.use((url, options): any => {
  console.log(`do request url = ${url}`)
  return {
    url,
    options: {
      ...options,
      headers: {},
    },
  };
});

/**
 * 所有响应拦截器
 */
request.interceptors.response.use(async (response): Promise<any> => {
  const res = await response.clone().json();
  if (res.code === 0) {
    return res.data;
  }
  if (res.code === 40100) {
    history.replace({
      pathname: '/user/login',
      search: stringify({
        redirect: location.pathname,
      }),
    });
    message.error('未登录');
  } else {
    message.error(res.description);
  }
  return res;
});

export default request;

与方式1不同,这个直接返回res.data即是我们要的data。
使用时比如api.tsx文件的 request 依赖引入改成自定义的request

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

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

相关文章

windows子系统wsl完成本地化设置locale,LC_ALL

在 Windows 的子系统 Linux&#xff08;WSL&#xff09;环境中&#xff0c;解决本地化设置问题可以采取以下步骤&#xff1a; 1. **检查本地化设置**&#xff1a; 打开你的 WSL 终端&#xff08;比如 Ubuntu、Debian 等&#xff09;&#xff0c;运行以下命令来查看当前的本…

大数据技术基础编程、实验和案例----大数据课程综合实验案例

一、实验目的 (1&#xff09;熟悉Linux系统、MySQL、Hadoop、HBase、Hive、Sqoop、R、Eclipse等系统和软件的安装和使用&#xff1b; (2&#xff09;了解大数据处理的基本流程&#xff1b; (3&#xff09;熟悉数据预处理方法&#xff1b; (4&#xff09;熟悉在不同类型数据库之…

湖南(用户洞察)源点咨询 论用户画像于精准营销之意义作用

湖南源点市场调研咨询认为&#xff0c;精准描摹用户画像是实现有效获客的重要方法。 因为只有通过用户画像&#xff0c;我们才能够持续不断了解用户现阶段的需求&#xff0c;痛点以及偏好。 用户画像不是简单的理解为对人群打标签&#xff0c;而是要通过大量的数据采集和分析…

螺旋文字滚动特效源码解析

如图所示&#xff0c;今天看到一个很炫酷的双文字螺旋滚动特效&#xff0c;两行文字呈螺旋状变化&#xff0c;在网站中这样的效果对用户很有吸引力。本文将基于原网站解析如何实现这个炫酷的效果&#xff0c;基于这个动图可以分析出需要实现的要点&#xff1a; 文字呈螺旋状滚…

管理流创建schema流程源码解析

一、简析 schema是pulsar重要的功能之一&#xff0c;现在就一起从源码的视角看下管理流创建schema时客户端和服务端的表现 客户端 客户端主要经历以下四个步骤 创建Schema实例 根据数据类型创建相对应的实例&#xff0c;例如Avro创建AvroSchema、JSON创建JSONSchema等 获取…

1.1、centos stream 9安装Kubernetes v1.30集群 环境说明

最近正在学习kubernetes&#xff0c;买了一套《Kubernetes权威指南 从Docker到Kubernetes实践全接触(第六版)》这本书讲得很好&#xff0c;上下两册&#xff0c;书中k8s的版本是V1.29&#xff0c;目前官网最新版本是v1.30。强烈建议大家买一套看看。 Kubernetes官网地址&#x…

jenkins使用docker api配置自签证书 +发布项目

配置证书 1、创建目录/etc/docker/certs&#xff0c; 在该目录下执行下列命令 openssl genrsa -aes256 -out ca-key.pem 4096 openssl req -new -x509 -days 3650 -key ca-key.pem -sha256 -out ca.pemopenssl genrsa -out server-key.pem 4096 \ openssl req -subj "/…

常见的应急救援设备有哪些_鼎跃安全

在我们的生活中&#xff0c;应急事件的发生常常是突如其来的&#xff0c;它们对人民的生命财产安全构成重大威胁&#xff0c;同时也对社会稳定提出严峻挑战。在这样的紧急情况下&#xff0c;迅速开展有效的救援工作显得尤为重要。而在整个救援过程中&#xff0c;应急设备的使用…

【简历】湘南某二本学院:前端简历指导,秋招面试通过率低

注&#xff1a;为保证用户信息安全&#xff0c;姓名和学校等信息已经进行同层次变更&#xff0c;内容部分细节也进行了部分隐藏 简历说明 这是一份25届二本同学的前端简历&#xff0c;但是这个简历&#xff0c;因为学校是个二本的专业&#xff0c;虽然说主体是在小公司&#x…

计算机基础(Windows 10+Office 2016)教程 —— 第6章 电子表格软件Excel 2016(下)

电子表格软件Excel 2016 6.4 Excel 2016的公式与函数6.4.1 公式的概念6.4.2 公式的使用6.4.3 单元格的引用6.4.4 函数的使用6.4.5 快速计算与自动求和 6.5 Excel 2016的数据管理6.5.1 数据排序6.5.2 数据筛选6.5.3 分类汇总6.5.4 分组显示6.5.5 合并计算 6.6 Excel 2016的图表6…

什么品牌的开放式耳机好用?南卡、韶音、漫步者 三款口碑超群机型横评

现如今耳机几乎成为了日常标配&#xff0c;因为选择合适的耳机成为我们不可忽视的需求。开放式耳机凭借其既能沉浸于高品质音乐&#xff0c;又能保持对周围环境的敏锐感知的独特优势&#xff0c;在市场中脱颖而出&#xff0c;尤其受到运动爱好者及追求生活品质的朋友们的喜爱。…

风吸杀虫灯采用新型技术 无公害诱虫捕虫

TH-FD2S】风吸杀虫灯利用害虫的趋光性和对特定波长的光源&#xff08;如紫外光、蓝光&#xff09;的敏感性&#xff0c;通过光波引诱害虫成虫扑灯。同时&#xff0c;内置的风扇产生强烈的气流&#xff0c;形成负压区&#xff0c;将害虫迅速吸入到收集器中。害虫在收集器内被风干…

排序算法:快速排序,golang实现

目录 前言 快速排序 代码示例 1. 算法包 2. 快速排序代码 3. 模拟程序 4. 运行程序 5. 从大到小排序 快速排序的思想 快速排序的实现逻辑 1. 选择基准值 (Pivot) 2. 分区操作 (Partition) 3. 递归排序 循环次数测试 假如 10 条数据进行排序 假如 20 条数据进行…

从入门到自动化:一篇文章掌握Python的80%

Python作为一种高级编程语言&#xff0c;以其简洁明了的语法和强大的功能性&#xff0c;在全球编程社区内享有极高的声誉。本文将带领你从Python的基础语法入手&#xff0c;介绍其常用库的应用&#xff0c;以及如何将Python用于数据分析、网络爬虫和简单的自动化任务&#xff0…

模板(c++)part2

目录 1.非类型模板参数 2.特化 2.1函数模板特化 2.2类模板特化 2.2.1全特化 2.2.2偏特化 3.模板分离编译 1.非类型模板参数 注意&#xff0c;假如 #define N 10 template<class T> class A { private:T a[N]; }; 这样的一个类模板&#xff0c;a数组的大小是定死的 …

canvas绘制表格

canvas绘制表格 最近在为公司产品做技术预研&#xff0c;经理让用canvas做一个表格&#xff0c;于是就有了这篇博客。 我们的数据是后端通过MQTT推送过来的 我在代码中也直接使用了 具体MQTT的实现代码&#xff0c;可见博客 在vue使用MQTT 在这里为了方便实用我直接封装成组件…

【中项第三版】系统集成项目管理工程师 | 第 11 章 规划过程组⑥ | 11.15 - 11.17

前言 第11章对应的内容选择题和案例分析都会进行考查&#xff0c;这一章节属于10大管理的内容&#xff0c;学习要以教材为准。本章上午题分值预计在15分。 目录 11.15 规划资源管理 11.15.1 主要输入 11.15.2 主要工具与技术 11.15.3 主要输出 11.16 估算活动资源 11.1…

安装jdk和tomcat

安装nodejs 1.安装nodejs&#xff0c;这是一个jdk一样的软件运行环境 yum -y list installed|grep epel yum -y install nodejs node -v 2.下载对应的nodejs软件npm yum -y install npm npm -v npm set config .....淘宝镜像 3.安装vue/cli command line interface 命令行接…

轻松搞定 Nginx 在 CentOS 和 Ubuntu 上的安装与配置

注&#xff1a;这是对我以前博客进行优化后再次发布的&#xff0c;博客中的截图为以前的。原博客已删除。 如何安装nginx nginx是一款开源、高性能的Web和反向代理服务器&#xff0c;支持HTTP、HTTPS、SMTP、POP3和IMAP协议。由于其轻量级、资源占用少和强大的并发能力&#…

时空预测又爆火了!新SOTA实现零样本精准预测

时空预测又有新突破啦&#xff01;港大、华南理工等提出了时空大模型UrbanGPT&#xff0c;在性能上猛超现有SOTA&#xff0c;实现零样本即可时空预测&#xff01; 另外还有清华的首个通用城市时空预测模型UniST、能即插即用快速适配的时空提示调整机制FlashST...这些效果非常ni…