网站首页 > 技术文章 正文
Dear,大家好,我是“前端小鑫同学”,长期从事前端开发,安卓开发,热衷技术,在编程路上越走越远~
写作背景:
在项目运维期间,往往出故障的情况很大程度都是因为数据与预期不一致导致的,在没办法登录生产环境的情况下,我们需要在既不更待代码(把报文贴到代码里,你别着急提交到master就好)又能模拟故障接口数据的时候就需要用到这样的插件(Ajax Interceptor[1])。
使用场景:
- 第一个就是开发中当有前置接口阻碍不能调试后续接口的情况,可以通过插件模拟数据。
- 第二个就是使用生产数据在开发环境排查因数据问题造成的系统故障。
- 第三个就是在上线前夕紧急修复因数据超预期导致的系统故障(这时候不建议将报文贴到代码里面)。
插件页面介绍:
具体的使用文末给出了插件作者的文章链接,可以详细阅读使用。
扩展插件:
这个插件挺简洁的但是有些场景还是不支持,就比如说下面这个Issues说的,所以我花了点时间尝试进行了一下扩展。
调整插件布局:
通过观察项目,iframe文件夹内为插件的主界面,引用了react包,我们可以通过仿照匹配模式的代码来处理请求方式如何设置,增加完下面的两块代码后通过执行build命令可以完成构建。
增加请求方式切换的Select组件:
<Select defaultValue={requestType} style={{width: '30%'}} onChange={e => this.handleRequestTypeChange(e, i)}>
<Option value="GET">GET</Option>
<Option value="POST">POST</Option>
<Option value="PUT">PUT</Option>
<Option value="DELETE">DELETE</Option>
</Select>
增加请求方式切换事件
handleRequestTypeChange = (val, i) => {
window.setting.ajaxInterceptor_rules[i].requestType = val;
this.set('ajaxInterceptor_rules', window.setting.ajaxInterceptor_rules);
this.forceUpdate();
}
加载插件:
我们页面修改后就可以添加到Chrome浏览器预览了,我们不考虑插件打包,按下图直接添加即可,开发者模式记得打开一下:
如何让请求方式的配置生效:
我们这时候需要处理的就是pageScripts\main.js文件,这个文件里面包含的主要的两个函数myFetch和myXHR,分别重写了系统内置的fetch和XMLHttpRequest,我们分别来对两种请求读取请求方式与配置的请求方式对比,决定是否替换响应内容。
处理fetch请求:
通过查看MDN[2]得到使用fetch请求时method的三种设置情况:
- 仅传递请求地址的时候,默认请求方式为GET,无法通过参数读取;
- 传递1个参数但类型是Request[3],可以在对象中读取到请求方式;
- 传入两个参数,第一个参数为请求地址,第二个参数为opts选项,可以在opts对象中读取请求方式。
let openInterception = false;
// 查找method并决定是否拦截
let haveMethod = false;
for (const arg of args) {
if(arg['method']){
haveMethod = true;
openInterception = arg['method'].toLocaleUpperCase() === requestType;
}
}
// 未设置method的按默认GET方式处理,需要对比requestType是否为默认的GET方式
if(!haveMethod) {
openInterception = requestType === "GET";
}
。。。
if (matched && openInterception) {
window.dispatchEvent(new CustomEvent("pageScript", {
detail: {url: response.url, match}
}));
txt = overrideTxt;
}
处理XMLHttpRequest请求:
直接使用这个对象发请求已经是好久之前的事了,通过查询和观察对象并没有直接找到请求参数可以怎么读取,但既然能可定会通过open函数来传递请求参数,那我就重写一个open函数把请求的参数记录一下吧。
let open = XMLHttpRequest.prototype.open;
window.XMLHttpRequest.prototype.open = function(...args){
this['requestParams'] = args;
open.apply(this, args);
}
在每次接到请求后来判断requestParams中是否包含特有的请求方式来启动开关:
let openInterception = xhr.requestParams.find(v => v === requestType) ? true : false;
源码分享:
ajax-interceptor(支持设置Method)[4],进行了简单的测试感觉还行,拉取代码后直接加载已解压扩展程序使用即可。不知道这个思路是否完全符合这个Issuse呀,有不同意见的还请交流一下。
推荐阅读:
- 19年插件作者掘金的文章:chrome插件:拦截ajax请求并修改返回结果
- 通过掘金推荐的文章:前端请装上这个Chrome插件
欢迎关注我的公众号“前端小鑫同学”,原创技术文章第一时间推送。
引用链接
[1] Ajax Interceptor: https://chrome.google.com/webstore/detail/ajax-interceptor/nhpjggchkhnlbgdfcbgpdpkifemomkpg?hl=zh-CN
[2] MDN: https://developer.mozilla.org/zh-CN/docs/Web/API/fetch
[3] Request: https://developer.mozilla.org/zh-CN/docs/Web/API/Request
[4] ajax-interceptor(支持设置Method): https://github.com/OSpoon/ajax-interceptor
猜你喜欢
- 2024-09-26 vue3新特征和所有的属性,方法汇总及其对应源码分析
- 2024-09-26 git仓库删除所有提交历史记录,成为一个干净的新仓库
- 2024-09-26 react相关基础知识(react教程,看这篇就够了)
- 2024-09-26 Vue2与Vue3的数据响应式区别(vue3和vue2的优缺点)
- 2024-09-26 关于Vue和React的一些对比及个人思考(中)
- 2024-09-26 我是小白:我该用Flux吗?解疑分享(flux.1 模型下载)
- 2024-09-26 我为LowCodeEngine低代码引擎写了个插件
- 2024-09-26 深入浅出 React V16.4 生命周期的来龙去脉
- 2024-09-26 CharIN有关充电功率的规划(充电功率计算充电时间)
- 2024-09-26 解析!Android内存优化工具(android如何节省内存优化)
- 1515℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 579℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 515℃MySQL service启动脚本浅析(r12笔记第59天)
- 487℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 486℃启用MySQL查询缓存(mysql8.0查询缓存)
- 471℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 450℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 448℃MySQL server PID file could not be found!失败
- 最近发表
-
- 宝塔面板Nginx如何提高网站访问速度?
- 接口调试工具ApiPost中form-data/x-www-form-urlencoded/raw区别
- 高并发场景下,Nginx性能如何提升10倍?
- 高并发场景下,Nginx如何抗住千万级流量?
- 浏览器中在线预览pdf文件,pdf.mjs插件实现web预览pdf
- 为什么你的网站加载慢?90%的人忽略了这2个设置。
- 别再无脑复制Nginx配置了!掌握这10个"性能核弹"级参数
- 你的Nginx配置,可能就是你网站最慢的一环,注意这几个优化参数
- 深入浅出HTTP压缩技术(http2压缩)
- C程序设计之:1-1/2+1/3-... + 1/n 的和
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (83)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- c语言min函数头文件 (68)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)