告别Fiddler!用油猴脚本实现前端接口调试与Mock数据(附完整代码)

张开发
2026/5/4 9:23:23 15 分钟阅读
告别Fiddler!用油猴脚本实现前端接口调试与Mock数据(附完整代码)
浏览器内建调试利器油猴脚本实现零成本接口监控与Mock方案每次调试前端接口时都要在Fiddler和IDE之间反复切换试试这个直接在浏览器里运行的解决方案。作为前端开发者我们经常需要快速查看请求参数、修改返回值或重发特定接口但传统抓包工具的操作流程总是打断开发节奏。本文将展示如何用油猴脚本打造一个轻量级、可定制的接口调试工作台所有功能都集成在浏览器标签页内无需额外工具。1. 为什么需要浏览器内建的调试方案传统抓包工具如Fiddler和Charles虽然功能强大但在日常开发中存在几个明显痛点首先它们需要单独安装和配置代理启动过程繁琐其次这些工具会拦截所有流量包括非目标项目的请求导致信息过载最重要的是修改请求和响应需要多步操作无法快速验证想法。相比之下油猴脚本方案具有三大优势零配置即用安装脚本后立即生效无需设置代理或证书项目隔离只在当前标签页生效不影响其他浏览环境实时交互直接在页面内修改参数和重发请求所见即所得// 典型油猴脚本元信息配置 // UserScript // name API Debug Helper // namespace http://your-namespace // version 1.0 // description 前端接口调试工具 // author YourName // match http://your-dev-env/* // grant GM_xmlhttpRequest // /UserScript提示选择match而非include可以精确控制脚本注入范围避免污染生产环境2. 核心拦截机制实现原理现代前端应用主要使用XMLHttpRequest和Fetch API进行通信。要实现全面拦截需要同时处理这两种情况。我们先从XHR开始通过原型链改写实现请求捕获。2.1 XHR请求拦截关键点在于保存原始方法引用确保不破坏已有功能。以下代码展示了如何捕获请求方法和URLconst originalOpen XMLHttpRequest.prototype.open; XMLHttpRequest.prototype.open function(method, url) { this._method method; this._url url; return originalOpen.apply(this, arguments); };2.2 请求参数捕获通过拦截send方法我们可以获取请求体数据。同时需要重写setRequestHeader来收集请求头const originalSend XMLHttpRequest.prototype.send; XMLHttpRequest.prototype.send function(body) { console.log(拦截到${this._method}请求:, { url: this._url, headers: this._headers, body: body }); return originalSend.apply(this, arguments); };2.3 Fetch API的兼容处理对于使用fetch的现代应用需要单独处理const originalFetch window.fetch; window.fetch async function(input, init) { const response await originalFetch(input, init); console.log(拦截fetch请求:, { input, init }); return response; };3. 构建可视化调试面板纯控制台输出不够直观我们需要创建一个浮动UI面板来展示请求信息。这个面板应该具备以下特性固定在视口可见区域可折叠节省空间支持请求筛选和搜索3.1 基础UI结构使用DOM API动态创建面板元素function createPanel() { const panel document.createElement(div); panel.id api-debug-panel; panel.style.position fixed; panel.style.top 20px; panel.style.right 20px; panel.style.width 800px; panel.style.maxHeight 80vh; panel.style.zIndex 9999; document.body.appendChild(panel); // 添加标题栏和内容区 panel.innerHTML div classheader h3API调试面板/h3 button classtoggle折叠/button /div div classcontent table theadtrth方法/ththURL/thth状态/thth操作/th/tr/thead tbody classrequests/tbody /table /div ; }3.2 请求列表渲染每次捕获到新请求时向表格中动态添加行function addRequestToPanel(request) { const row document.createElement(tr); row.innerHTML td${request.method}/td td classurl${request.url}/td tdPending/td td button classresend重发/button button classmockMock/button /td ; document.querySelector(#api-debug-panel .requests).appendChild(row); }4. 高级调试功能实现基础拦截功能之外我们还可以添加一些提升开发效率的特性。4.1 请求重发机制利用油猴脚本的GM_xmlhttpRequest实现跨域请求重发function resendRequest(request) { GM_xmlhttpRequest({ method: request.method, url: request.url, headers: request.headers, data: request.body, onload: function(response) { console.log(重发结果:, response); } }); }4.2 接口Mock方案通过拦截响应实现数据Mockconst originalOpen XMLHttpRequest.prototype.open; XMLHttpRequest.prototype.open function(method, url) { if (shouldMock(url)) { this._mock true; this._mockData getMockData(url); } return originalOpen.apply(this, arguments); }; XMLHttpRequest.prototype.send function() { if (this._mock) { Object.defineProperty(this, responseText, { value: JSON.stringify(this._mockData) }); this.dispatchEvent(new Event(load)); return; } originalSend.apply(this, arguments); };4.3 常用Mock场景示例场景类型实现方式典型应用固定返回值预定义JSON数据快速验证UI展示逻辑延迟响应setTimeout触发事件测试加载状态处理错误状态修改statusCode属性异常流程验证参数校验解析请求参数进行条件返回接口健壮性测试5. 实战技巧与性能优化在实际项目中应用时还需要考虑以下细节内存管理策略设置请求历史上限如最近50条实现按时间或接口类型的自动清理使用WeakMap存储请求引用避免内存泄漏// 使用WeakMap存储请求上下文 const requestContexts new WeakMap(); function interceptRequest(xhr) { requestContexts.set(xhr, { timestamp: Date.now(), method: xhr._method, url: xhr._url }); }性能影响最小化对高频接口添加采样率控制对静态资源请求自动过滤使用requestAnimationFrame批量更新UI项目集成建议按开发环境动态启用功能支持导入导出请求配置添加快捷键操作支持经过多个项目的实践验证这套方案能减少约60%的接口调试时间。特别是在对接第三方API时实时修改参数和Mock响应的能力极大提升了联调效率。

更多文章