拦截HTTP的多种方式

news/2024/10/6 2:18:49/
http://www.w3.org/2000/svg" style="display: none;">

部分场景下需要修改请求报文信息,可以利用 AOP 思维(切面编程),对请求进行拦截处理。Web 中有见的几种发送请求的方式:

  • XMLHttpRequest
  • fetch
  • window.navigator.sendBeacon
  • new Image
  • service worker

针对这几种不同的场景,分别拦截处理它的 URL 和请求参数

(一)设计

http://www.w3.org/2000/svg" height="123" viewbox="0 0 940.7765502929688 123" class="mermaid-svg">
符合条件
使用新的 URL , BDOY
不符合条件
请求
Filter
Adaptor
发送请求

FilterAdaptor 成对出现,满足过滤过滤器的条件后,使用对用的适配器修改 URLBDOY

(二)不同的请求方式

1. XMLHttpRequest

XHR 的核心思路:

  1. 拦截 open,缓存参数信息
  2. 拦截 send,对 urlbody处理
  3. 调用原生 open、send 发送请求

核心代码实现:

class CustomXhr extends NativeXhr {private _method!: string;private _src = "" as K;private _async!: boolean;private _username?: string | null;private _password?: string | null;private _headers: Record<string, string> = {};open(method: string,url: K,async: boolean = true,username?: string | null,password?: string | null) {this._method = method;this._src = url;this._async = async;this._username = username;this._password = password;}setRequestHeader(name: string, value: string) {this._headers[name] = value;}send(body?: T) {let url = "" as K;let data = body;if (!_this.useNative) {[url, data] = _this.callFilterAndAdapter(this._src, body);}// Opensuper.open(this._method, url, this._async, this._username, this._password);// 设置请请求头Object.keys(this._headers).forEach((key) => {super.setRequestHeader(key, this._headers[key]);});return super.send(data);}
}

2. fetch

fetch 拦截的思路:

  1. 使用函数对原生 fetch 进行包装

核心代码实现:

const NativeFetch = window.fetch;function CustomFetch(input: K, init?: RequestInit) {if (_this.useNative) {return NativeFetch(input, init);}const [url, data] = _this.callFilterAndAdapter(input, init?.body as T);if (init && data) {init.body = data;}return NativeFetch(url, init);
}window.fetch = CustomFetch as typeof window.fetch;

3. window.navigator.sendBeacon

sendBeacon 的拦截思路:

  1. 同 fetch 的实现思路,对原生的 window.navigator.sendBeacon 进行包装一层

核心代码:

const oldSendBeacon = window.navigator.sendBeacon;
window.navigator.sendBeacon = (url: K, data: T) => {// 使用原生方式if (this.useNative) {return oldSendBeacon.call(window.navigator, url, data);}const [newUrl, newData] = this.callFilterAndAdapter(url, data);return oldSendBeacon.call(window.navigator, newUrl, newData);
};

备注:sendBeacon 的上下文一定要是window.navigator,所以需要使用oldSendBeacon.call(window.navigator, url, data)

4. new Image

new Image拦截思路:

  1. CustomImage 类继承自 Window.Image
  2. 使用 set、get 拦截 src属性的读写

核心代码实现:

const NativeImage = window.Image;class CustomImage extends NativeImage {private _src!: K;set src(value: K) {if (_this.useNative) {this._src = value;return;}this._src = _this.newSetHandler(value);this.setAttribute("src", this._src);}get src() {return this._src;}
}window.Image = CustomImage;

5. service worker

这个就不细聊了,有兴趣的可以自己去看下

(三)源码

install

npm i @swl/http-interceptor

源代码: https://github.com/swlws/http-interceptor


http://www.ppmy.cn/news/1473814.html

相关文章

Golang | Leetcode Golang题解之第213题打家劫舍II

题目&#xff1a; 题解&#xff1a; func _rob(nums []int) int {first, second : nums[0], max(nums[0], nums[1])for _, v : range nums[2:] {first, second second, max(firstv, second)}return second }func rob(nums []int) int {n : len(nums)if n 1 {return nums[0]}…

Vue3+.NET6前后端分离式管理后台实战(二十八)

1&#xff0c;Vue3.NET6前后端分离式管理后台实战(二十八)

昇思25天学习打卡营第2天|MindSpore快速入门

打卡 目录 打卡 快速入门案例&#xff1a;minist图像数据识别任务 案例任务说明 流程 1 加载并处理数据集 2 模型网络构建与定义 3 模型约束定义 4 模型训练 5 模型保存 6 模型推理 相关参考文档入门理解 MindSpore数据处理引擎 模型网络参数初始化 模型优化器 …

封锁-封锁模式(共享锁、排他锁)、封锁协议(两阶段封锁协议)

一、引言 1、封锁技术是目前大多数商用DBMS采用的并发控制技术&#xff0c;封锁技术通过在数据库对象上维护锁来实现并发事务非串行调度的冲突可串行化 2、基于锁的并发控制的基本思想是&#xff1a; 当一个事务对需要访问的数据库对象&#xff0c;例如关系、元组等进行操作…

在VMware虚拟机的创建以及安装linux操作系统

一、创建虚拟机 1.双击打开下载好的VMware Workstation软件 2.点击“创建新的虚拟机” 3.根据个人选择需要创建的虚拟机&#xff0c;点击下一步 4.直接点击下一步 5.选择稍后安装操作系统&#xff0c;点击下一步 、 6.选择需要的操作系统&#xff0c;点击下一步 7.根据…

Laravel表单验证:构建安全的Web应用基石

Laravel表单验证&#xff1a;构建安全的Web应用基石 在Web开发中&#xff0c;表单请求验证是确保数据完整性和安全性的关键环节。Laravel&#xff0c;作为一个功能丰富的PHP Web框架&#xff0c;提供了一套强大且易于使用的验证机制。本文将深入探讨Laravel的表单请求验证是如…

贪心算法-以学籍管理系统为例

1.贪心算法介绍 1.算法思路 贪心算法的基本思路是从问题的某一个初始解出发一步一步地进行&#xff0c;根据某个优化测度&#xff0c;每一 步都要确保能获得局部最优解。每一步只考虑一 个数据&#xff0c;其选取应该满足局部优化的条件。若下 一个数据和部分最优解连在一起…

SQL中Order by详解

在 MySQL 中&#xff0c;ORDER BY 语句用于对查询结果进行排序。 语法&#xff1a; SELECT column1, column2,... FROM table_name ORDER BY column_name [ASC | DESC];以下是对其主要部分的详细解释&#xff1a; column_name &#xff1a;指定要依据其进行排序的列名。 ASC…