02 创建拦截器

news2024/9/23 1:16:20

请求拦截器本质上是在请求之前调用的函数,用来对请求参数进行新增和修改

响应拦截器本质上是在响应之后调用的函数,用来对响应数据做点什么。

创建拦截器的步骤如下:

整个流程是

  1. 声明拦截器(一个对象,包含请求响应拦截器)。
  2. 调用请求处理:发送请求之前调用请求拦截器处理。
  3. 调用响应处理:在 wx.requestsuccessfail 回调中,为 res 加上 isSuccess, 分别调用 this.interceptors.response 方法来处理响应数据。
  4. 定义拦截器(在实例中定义):
    1. 请求拦截器:获取 token 并加入请求头;
    2. 响应拦截器:
      1. isSuccess 为 false 则为网络错误,若为 true,分情况
      2. code=200,正常返回 data;
      3. code=208,token 失效;
      4. 其余使用默认错误

声明拦截器

  1. WxRequest 类中定义了一个 interceptors 对象,该对象包含两个方法:requestresponse。这两个方法分别用于处理请求前和响应后的逻辑。
interceptors = {
  // 请求拦截器
  request: (config) => config,
  // 响应拦截器
  response: (response) => response
}

调用请求处理

  1. request 方法中,在发送请求之前,通过调用 this.interceptors.request 方法来处理请求配置。
// 在发送请求之前调用请求拦截器
options = this.interceptors.request(options)

调用响应处理

  1. wx.requestsuccessfail 回调中,分别调用 this.interceptors.response 方法来处理响应数据。
// 当接口调用成功时会触发 success 回调函数
success: (res) => {
  // 不管接口成功还是失败,都需要调用响应拦截器
  const mergeRes = Object.assign({}, res, { config: options })
  resolve(this.interceptors.response(mergeRes))
},
// 当接口调用失败时会触发 fail 回调函数
fail: (err) => {
  // 不管接口成功还是失败,都需要调用响应拦截器
  const mergeErr = Object.assign({}, err, { config: options })
  // 不管接口成功还是失败,都需要调用响应拦截器
  err = this.interceptors.response(mergeErr)
  reject(err)
}

定义拦截器

  1. 在实例化 WxRequest 类之后,可以通过修改 instance.interceptors.requestinstance.interceptors.response 方法来配置具体的拦截器逻辑。
// 配置请求拦截器
instance.interceptors.request = (config) => {
  // 在发送请求之前做些什么
  return config
}
// 响应拦截器
instance.interceptors.response = (response) => {
  // 对响应数据做点什么
  return response.data
}

这样,拦截器就被成功添加到了 WxRequest 类中,并且可以在请求前和响应后执行自定义逻辑。在请求拦截器中,你可以修改请求配置,例如添加头部信息;在响应拦截器中,你可以根据响应数据进行一些处理,例如提取响应数据中的 data 属性。

下面是自定义逻辑:

  1. 请求拦截器:获取 token 并加入请求头;
  2. 响应拦截器:
    1. isSuccess 为 false 则为网络错误,若为 true,分情况
    2. code=200,正常返回 data;
    3. code=208,token 失效;
    4. 其余使用默认错误;
//在顶部引入
import {toast,modal}from './extendApi'

// 配置请求拦截器
  instance.interceptors.request = (config) => {
    // 从本地获取 token
    if (wx.getStorageSync('token')) {
      // 如果存在 token ,则添加请求头
      config.header['token'] = wx.getStorageSync('token')
    }

    // 返回请求参数
    return config
  }

  // 响应拦截器
  instance.interceptors.response = async (response) => {
    const { data, isSuccess } = response
    if (!isSuccess) {
      if (!isSuccess) {
        toast({
          title: '网络异常请重试',
          icon: 'error'
        })
        // 抛出异常
        return Promise.reject(response)
      }
    }
    // 网络正常
    switch (data.code) {
      case 200:
        // 接口调用成功,服务器成功返回了数据,只需要将数据简化以后返回即可
        return data

      case 208:
        const res = await modal({
          content: '鉴权失败,请重新登录',
          showCancel: false
        })

        if (res) {
          // 既然用户需要重新进行登录,就需要把之前用户存储的信息(过期的 token) 进行清除
          // clearStorage()
          wx.clearStorageSync()

          wx.navigateTo({
            url: '/pages/login/login'
          })
        }


      default:
        toast({
          title: '程序出现异常,请联系客服或稍后重试!'
        })
        return Promise.reject(response)
    }
  }

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

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

相关文章

机械设计中倒角与倒圆角

我们常说,机械设计要做到“一切尽在掌握中”。 包含两层意思:一是所有的结构细节都是仔细思考过并且完整表达,不能靠在制造过程中猜测设计意图、由制造人员再设计或自由发挥。 二是所有的设计都是有根据的,不能靠拍脑袋任意发挥…

【路径规划】自动泊车的 Simulink 模型

摘要 本文介绍了一个用于自主机器人路径规划和导航的 Simulink 模型,该模型结合了路径跟踪算法(如 Pure Pursuit)和动态机器人模型,实现了复杂环境中的路径跟随和导航控制。实验结果表明,模型能够在给定路径上精确控制…

【neo4j】neo4j和Cypher 查询语言相关知识点

【neo4j】neo4j和Cypher 查询语言相关知识点 1.什么是neo4j Neo4j 是一个广泛使用的图形数据库管理系统(Graph Database Management System)。它是一种NoSQL数据库,专为存储和查询图形数据而设计。Neo4j 支持图形数据模型,允许用…

误差评估,均方误差、均方根误差、标准差、方差

均方根误差 RMSE/RMS 定义 RMSE是观察值与真实值偏差的平方,对于一组观测值 y i y_i yi​ 和对应的真值 t i t_i ti​ R M S E 1 n ∑ i 1 n ( y i − t i ) ,其中n是观测次数 RMSE\sqrt{\frac1n \sum_{i1}^n (y_i-t_i)} \text{,其中n是…

Python|OpenCV-实现识别目标图像中的圆圈(20)

前言 本文是该专栏的第22篇,后面将持续分享OpenCV计算机视觉的干货知识,记得关注。 在处理图像检测项目的时候,可能会遇到需要检测目标图像中的“圆圈”需求。笔者在这里举个例子,如下图所示: 在图中有一个篮球,但是我们要找的目标对象并不是篮球,而是篮球它本身的这个…

智能BI平台项目

1.项目介绍 BI商业智能:数据可视化、报表可视化系统 4)发布订阅 Resource 是基于名称进行查找的,而Spring框架中更常用的 Autowired 则是基于类型进行查找的。如果找不到匹配的bean,Autowired 会抛出异常,而 Resource…

java项目之基于spring boot的多维分类的知识管理系统的设计与实现源码

项目简介 基于spring boot的多维分类的知识管理系统的设计与实现实现了以下功能: 基于spring boot的多维分类的知识管理系统的设计与实现的主要使用者管理员可以管理用户信息,知识分类,知识信息等,用户可以查看和下载管理员发布…

如何创建标准操作规程(SOP)[+模板]

创建、分发和管理流程文档和逐步说明的能力是确定企业成功的关键因素。许多组织依赖标准操作规程(SOP)作为基本形式的文档,指导他们的工作流程操作。 然而,SOP不仅仅是操作路线图;它们就像高性能车辆中的先进GPS系统一…

01_RabbitMQ安装及工作模式

一、消息队列MQ 中间件 1.1 什么是消息队列 消息(Message)是指在应用间传送的数据。消息可以非常简单,比如只包含文本字符串,也可以更复杂,可能包含嵌入对象。 消息队列(Message Queue)是一…

5.工欲善其事,必先利其器!收集金融数据你必须先做这个!

在正式从网络上获取数据并存储到我们的数据库之前,我们还需要做一些准备工作。其中最重要的无疑是把Python环境配置好。 你可以不好好学习Python,毕竟我后边会一步步教大家,也会提供现成的Python脚本。但是你必须得在你的电脑上把Python安装…

YOLOv10改进,YOLOv10替换主干网络为PP-HGNetV2(百度飞桨视觉团队自研,独家手把手教程,助力涨点)

摘要 PP-HGNetV2(High Performance GPU Network V2) 是百度飞桨视觉团队自研的 PP-HGNet 的下一代版本,其在 PP-HGNet 的基础上,做了进一步优化和改进,最终在 NVIDIA GPU 设备上,将 “Accuracy-Latency Balance” 做到了极致,精度大幅超过了其他同样推理速度的模型。其在…

如何用ChatGPT制作一款手机游戏应用

有没有想过自己做一款手机游戏,并生成apk手机应用呢?有了人工智能,这一切就成为可能。今天,我们就使用ChatGPT来创建一个简单的井字棋游戏(Tic-Tac-Toe),其实这个过程非常轻松且高效。 通过Cha…

828 华为云征文|华为 Flexus 云服务器搭建萤火商城 2.0

在今天这个意义非凡的日子,我怀揣着满心的期待与憧憬,毅然踏上了利用华为 Flexus 云服务器搭建轻量级、高性能、前后端分离的电商系统萤火商城 2.0 的征程。这一旅程,注定充满了挑战与惊喜,犹如在浩瀚的数字海洋中探索未知的宝藏。…

java-----方法

目录 什么是方法? 方法的作用? 方法的格式: 方法的重载: 方法的内存原理 方法的值传递: 什么是方法? :程序中最小的执行单元(要么全执行,要么全不执行) public class methoddeom3 {public static void main(String[] args) {System.out.println("hello…

旧系统迁移新框架:FastAPI 的 WSGIMiddleware 让过程变得简单

在现代 Web 开发中,我们经常需要将新的技术与现有的系统整合。FastAPI,作为一个现代、快速(高性能)的 Web 框架,提供了与 WSGI 应用集成的能力,这使得 Django、Flask 等传统 Python Web 框架可以与 FastAPI…

五种数据库特性对比(Redis/Mysql/SQLite/ES/MongoDB)

做后端开发的程序员基本都要学会数据库的相关知识。 1、关系型数据 今天就着这段时间了解大模型的事需要牵扯到是我们接触最多的、也是入门后端必学的关系型数据库。在关系型数据库中,数据以表的形式进行组织和存储,每个表就像一个 Excel 表格&#xf…

Python学习——【4.4】数据容器(序列)的切片

文章目录 【4.4】数据容器(序列)的切片一、了解什么是序列二、掌握序列的切片操作 【4.4】数据容器(序列)的切片 一、了解什么是序列 序列是指:内容连续、有序,可使用下标索引的一类数据容器。 列表、元组…

CSS 的继承性、层叠性与权重问题解析

目录 非 VIP 用户可前往公众号进行免费阅读 继承性 层叠性 CSS的权重问题 如果权重一样,以后出现的为准 以权重大的为准 没有选中,权重为0,就近原则 权重只和css顺序有关 非 VIP 用户可前往公众号进行免费阅读 CSS 的继承性、层叠性与权重问题解析本文主要介绍了 C…

EnvironmentError: [Errno 28] No space left on device - 完美解决方法

🚨EnvironmentError: [Errno 28] No space left on device - 完美解决方法💡 🚨EnvironmentError: [Errno 28] No space left on device - 完美解决方法💡摘要引言正文1. 错误解析:为什么会出现“No space left on dev…

html实现TAB选项卡切换

<!DOCTYPE html> <html> <head> <title>选项卡示例</title> <style> .tabs { overflow: hidden; /* 防止选项卡溢出容器 */ border: 1px solid #ccc; background-color: #f1f1f1; } .tab-links { margin: 0; padding: 0; l…