前端不用再等后端:抓包之后,我在代理层直接改接口
上周联调一个会员页,后端字段还没准备好,前端页面却要先走验收。
以前碰到这种事,无非三条路:干等接口、本地起一套 mock 服务、或者临时拉后端帮忙塞个数据。后来我发现,这类事放在代理层做最顺手------请求照常发出去,响应回来的时候,只动需要改的那个字段。
AIProxy 的改包能力,大致是从「不写代码」到「写两行 JS」递进:八成的需求图形规则点点就行,剩下两成带条件的,交给脚本。下面把我自己最常用的几个场景过一遍。操作都在 Rules 页面。
Map Local:接口没好,我自己造一个
最常见的情况。后端说「明天给你」,但你今天就想把页面跑通。
Map Local 的逻辑很简单:命中某个请求,直接返回你本地的一份文件,根本不往后端发。
- 准备一个 JSON,比如
user.json:
json
{
"id": 1,
"name": "张三",
"vip": true
}
- Rules → Mapping → Map Local,新建规则。
- 来源 URL 模式填接口地址的一部分,比如
api.example.com/user,子串匹配就行。 - 目标选那个
user.json,保存。
刷新页面,这个接口返回的就是你的 JSON 了。状态码固定 200,Content-Type 按文件后缀自动推断,啥都不用配。
还有个更骚的用法:把目标指向本地 dist/ 目录,用本地构建产物替换线上 JS / CSS。线上代码出了问题,本地改完直接映射上去调试,不用发版。
Rewrite:接口有了,但我只想改一个字段
后端返回了,但你只想改一个字段看效果------比如把 vip: false 改成 true,验证会员 UI。为这个改后端太重,用 Map Local 又要把整个 JSON 抄一遍。
用 Rewrite 的 Fields 模式:
- Rules → Rewrite 新建规则。更省事的做法:Sessions 里右键那条请求 → Create Rewrite Rule,URL 和 Method 自动带好。
- Match Stage 选 Response。
- 加一个 Body Rewrite,模式选 Fields。
- 填路径
vip,操作set,值true。
保存。原返回 {"name":"张三","vip":false} 变成 {"name":"张三","vip":true},其他字段原样保留。Fields 模式按 JSON Path 定位,data.user.name、items[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,前端会不会降级」。写条规则有点重,用断点。
断点是「人肉介入」:命中后请求暂停,等你手动改完再放行。
- Rules → Breakpoint,加规则,URL 填目标接口,Match Stage 选 Response。
- 触发接口,拦截面板滑出来。
- 改状态码、改 Header、改 Body,或者直接 Mock Response 填个固定返回跳过上游。
- 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 篇):
- 抓:从 Web 到手机,跑通一个开源抓包工具
- 改:抓到之后怎么改------从图形规则到 JS 脚本(本篇)
- 测:弱网、造异常、对比回归,以及我为什么开源
项目地址:github.com/small-dream...。规则没配明白、脚本没跑通,都可以在 issue 里贴截图问我。