抓到接口还不够:用 AIProxy 改返回、Mock 数据、切测试环境

前端不用再等后端:抓包之后,我在代理层直接改接口

上周联调一个会员页,后端字段还没准备好,前端页面却要先走验收。

以前碰到这种事,无非三条路:干等接口、本地起一套 mock 服务、或者临时拉后端帮忙塞个数据。后来我发现,这类事放在代理层做最顺手------请求照常发出去,响应回来的时候,只动需要改的那个字段。

AIProxy 的改包能力,大致是从「不写代码」到「写两行 JS」递进:八成的需求图形规则点点就行,剩下两成带条件的,交给脚本。下面把我自己最常用的几个场景过一遍。操作都在 Rules 页面。

Map Local:接口没好,我自己造一个

最常见的情况。后端说「明天给你」,但你今天就想把页面跑通。

Map Local 的逻辑很简单:命中某个请求,直接返回你本地的一份文件,根本不往后端发。

  1. 准备一个 JSON,比如 user.json:
json 复制代码
{
  "id": 1,
  "name": "张三",
  "vip": true
}
  1. Rules → Mapping → Map Local,新建规则。
  2. 来源 URL 模式填接口地址的一部分,比如 api.example.com/user,子串匹配就行。
  3. 目标选那个 user.json,保存。

刷新页面,这个接口返回的就是你的 JSON 了。状态码固定 200,Content-Type 按文件后缀自动推断,啥都不用配。

还有个更骚的用法:把目标指向本地 dist/ 目录,用本地构建产物替换线上 JS / CSS。线上代码出了问题,本地改完直接映射上去调试,不用发版。

Rewrite:接口有了,但我只想改一个字段

后端返回了,但你只想改一个字段看效果------比如把 vip: false 改成 true,验证会员 UI。为这个改后端太重,用 Map Local 又要把整个 JSON 抄一遍。

用 Rewrite 的 Fields 模式:

  1. Rules → Rewrite 新建规则。更省事的做法:Sessions 里右键那条请求 → Create Rewrite Rule,URL 和 Method 自动带好。
  2. Match Stage 选 Response
  3. 加一个 Body Rewrite,模式选 Fields
  4. 填路径 vip,操作 set,值 true

保存。原返回 {"name":"张三","vip":false} 变成 {"name":"张三","vip":true},其他字段原样保留。Fields 模式按 JSON Path 定位,data.user.nameitems[0].id 都支持,只想删一个字段就选 remove,比整段替换精确得多。

Rewrite 还能干这些(每个都有现成模板,一键创建):加调试头、关缓存(Cache-Control: no-store)、改 Query 追加参数、重定向到别的地址。

切环境:DNS 映射 / Map Remote,别碰 hosts

联调经常要切环境。老办法是改系统 hosts,改完刷 DNS,切回来又得改,还容易忘。AIProxy 里有两招,都不动 hosts。

DNS 映射 ------把域名指到某个 IP。Rules → Mapping → DNS,主机名填 api.example.com,目标 IP 填测试环境的 192.168.1.100。代理悄悄把流量送到那个 IP,但 Host 头和 TLS SNI 还是原域名,服务器证书不会报错,关掉代理自动失效。

Map Remote ------换整个上游。来源 api.example.com,目标 https://staging.example.com,它带着原 path 和 query 一起转过去,客户端完全无感,Sessions 里还保留原始 URL 上下文。

它俩和 Rewrite 的 Redirect 很容易搞混:

方式 行为 客户端感知
Map Remote 代理内部换上游,继续走管线 无感,连接不断
Rewrite Redirect 给客户端返回 3xx 客户端自己再发一次新请求

「想悄悄切环境」用 Map Remote;「想让浏览器真的跳走」用 Redirect。

断点:就想临时手改一发

规则是给反复出现的场景准备的。但有时候你只想改一次------验证「这个接口返回 500,前端会不会降级」。写条规则有点重,用断点

断点是「人肉介入」:命中后请求暂停,等你手动改完再放行。

  1. Rules → Breakpoint,加规则,URL 填目标接口,Match Stage 选 Response
  2. 触发接口,拦截面板滑出来。
  3. 改状态码、改 Header、改 Body,或者直接 Mock Response 填个固定返回跳过上游。
  4. Forward 放行。

断点有个地方千万记住:它不会自动放行。你不点 Forward / Drop,请求就一直挂着。用完记得禁用或删掉规则,不然下次又卡住,还查不出为啥。

怎么确认改没改对:Automation 标签

改完规则,刷新页面,打开那条请求,右侧 Response 区有个 Automation 标签。它把这条请求命中过的所有规则列出来,带 before/after diff------改了 Header、改了 Body 字段、还是做了 Redirect,一目了然。没生效也来这里看,会写清楚是 skipped 还是 failed 及原因。

图形不够用时,写段 JS(脚本规则)

图形规则覆盖八成场景,但总有些带条件、带逻辑的事,写几行代码比配一堆规则清爽:根据某个字段决定改不改、从响应里抠出 token 记一笔、给某类接口统一塞个签名。

AIProxy 内置了脚本规则:单文件 JavaScript 或 TypeScript,在请求和响应阶段都能介入,跑在一个 QuickJS 沙箱里。

一个脚本规则,本质就是导出一两个函数:

ts 复制代码
export function onRequest(ctx) {
  // 请求发出去之前
}

export function onResponse(ctx) {
  // 响应回来之后
}

导出一个也行,两个都导也行。ctx 给你 request、response、日志、提取数据这些能力。入口在 Rules → Scripts,New Script Rule,选语言、填匹配条件、贴脚本、保存,立即生效。

四个能直接抄的例子:

1. 给请求加调试头

ts 复制代码
export function onRequest(ctx) {
  ctx.request.setHeader("x-debug-mode", "true");
}

2. 按条件 Mock,不碰上游

ts 复制代码
export function onRequest(ctx) {
  if (!ctx.request.url.includes("/api/user/profile")) return;

  ctx.respond({
    status: 200,
    headers: [{ name: "content-type", value: "application/json" }],
    bodyText: JSON.stringify({ id: 1, name: "Mock User", role: "tester" }),
  });
}

ctx.respond 一调用,就不访问后端了,直接返回你给的响应。

3. 从响应里抠出 token

ts 复制代码
export function onResponse(ctx) {
  const data = ctx.response.getJson();
  const token = data?.token;
  if (!token) return;

  ctx.extract("token", token);
  ctx.log.info("token extracted", { length: String(token).length });
}

ctx.extract 提取的字段会出现在 Automation 标签里,排障一眼能看。

4. 改响应,打开前端功能开关

ts 复制代码
export function onResponse(ctx) {
  if (!ctx.request.url.includes("/feature-flags")) return;

  const data = ctx.response.getJson() ?? {};
  data.newDashboard = true;
  ctx.response.setJson(data);
}

后端 feature flag 还没开,前端想先验证新 UI,这就够了。写脚本有个小建议:先用 ctx.log.info 观察命中情况,确认 URL 和 Stage 配对了,再加修改逻辑,免得「改了半天发现根本没命中」。

几个故意没给的能力:脚本跑在严格沙箱里,不能 发网络请求、读写文件、调系统命令,也不能 import / require,单文件;单次执行超时 50ms,脚本大小上限 128KB。因为脚本是「用户写的代码」跑在「你的抓包工具」里,放开文件和网络风险太大。出错策略是 fail-open:脚本报错或超时,请求不会因此挂掉,大不了这次没生效,错误记在 Automation 里。一条脚本不会把整条代理链路拖死------牺牲了「无所不能」,换来「怎么折腾都安全」。


改造流量的能力就这些------Map、Rewrite、断点、脚本,复杂度递进,按需选。下一篇聊测试和排障:怎么造弱网、造异常、做接口对比回归,顺便聊聊我为什么把这项目开源了。

「AIProxy 实战」系列(共 3 篇):

  1. 抓:从 Web 到手机,跑通一个开源抓包工具
  2. 改:抓到之后怎么改------从图形规则到 JS 脚本(本篇)
  3. 测:弱网、造异常、对比回归,以及我为什么开源

项目地址:github.com/small-dream...。规则没配明白、脚本没跑通,都可以在 issue 里贴截图问我。

相关推荐
倾颜1 小时前
从 Web 到桌面:AI Mind Electron Desktop Host 的安全边界设计
前端
Csvn1 小时前
📡 前端错误监控从零搭建:window.onerror 与 unhandledrejection 的完整实践
前端
YuePeng1 小时前
Java 开发者的 Django Admin,终于来了
后端·架构·github
jarvisuni1 小时前
翻车了!GPT5.6接手Opus4.8的项目之后!
前端·人工智能·ai编程
XuCoder1 小时前
Redis 分片集群:它到底是怎么把数据分片又路由的?
后端
吃饱了得干活1 小时前
Java Map 核心原理:从数据结构到 put/get 执行,一篇彻底讲透
java·后端
不才不才不不才1 小时前
Spring 源码系列(17): HandlerMapping 与 HandlerAdapter 两大体系
java·后端·spring
Seven971 小时前
AI杂谈:别再问AI会不会替代你,先看你是不是驾驶员
人工智能·后端
ERD Online2 小时前
我们怎么设计 good first issue:让第一个 PR 两小时内合入
数据库·git·后端·开源·issue