在接口调试阶段,经常会遇到这样几种需求:
- 固定把某个参数改成测试值
- 强制把版本号改成旧版本
- 自动给请求 Header 加 token
- 重定向某个域名到测试环境
如果每次都手动断点修改,效率会很低。 更稳定的方式是:让代理自动改请求。
前提是流量必须经过代理。
一、确认流量是否经过代理
在开始写脚本之前,需要确认请求路径。
操作步骤
- 在电脑上启动代理工具(Charles / Proxyman / SniffMaster 代理模式)
- 确认监听端口已开启
- iPhone 与电脑连接同一 Wi-Fi
- 在 iPhone Wi-Fi 设置中填写代理地址与端口
- 安装并信任代理证书
- 用 Safari 打开 HTTPS 网站验证
如果 Safari 可以正常解密 HTTPS,就是走代理了。
二、验证目标 App 是否走代理
打开目标 App,触发网络请求。
如果请求出现在代理工具中:
- 说明可以继续写自动规则
- 修改将在代理层生效
如果没有请求出现,需要先解决“流量是否走代理”的问题。
三、为什么自动修改只能在代理模式下进行
自动修改请求的前提是:
- 请求在到达服务器前被代理截获
- 数据在代理中以明文形式存在
设备本机抓包只负责采集数据,不参与转发,因此不能修改。
这一点需要提前确认。
四、使用 Charles / Proxyman 的规则功能
在 Charles 中可以使用 Rewrite 或 Breakpoints。 在 Proxyman 中可以使用 Rewrite Rule 或 Script。
举一个实际示例:
需求:
把所有 /api/v1/login 请求的 version=2 改为 version=1
在 Charles Rewrite 中配置:
- 匹配 URL:
/api/v1/login - 替换参数:
version=2→version=1
保存后再次触发请求。
验证方式:
- 在代理工具中查看请求参数
- 对比服务器响应是否改变
五、使用 SniffMaster 进行自动修改请求
在 SniffMaster 中,自动修改请求通过 拦截器(仅代理模式下可用) 实现。
进入代理抓包模式
- 启动 SniffMaster
- 选择设备或本机
- 进入 HTTPS 代理抓包模式
- 确认流量可正常显示
打开拦截器
- 在代理抓包界面右侧点击插件图标
- 打开拦截器日志界面
- 开启拦截功能开关
- 点击“编辑拦截器”
编写修改请求的脚本
拦截器结构固定:
function handleRequest(request) {
return request
}
function handleResponse(response) {
return response
}
function filterUrl() {
return []
}
假设需求是:
- 将某个接口的请求参数
role=user改为role=admin
可以这样写:
function handleRequest(request) {
if (!request.IsBase64Body) {
let body = request.Body
body = body.replace("role=user", "role=admin")
request.Body = body
}
return request
}
function handleResponse(response) {
return response
}
function filterUrl() {
return ["https://api.example.com/v1/*"]
}
保存脚本后再次触发请求。
六、验证修改是否成功
验证步骤必须明确:
- 在代理记录中查看修改后的请求体
- 对比服务器响应是否变化
- 观察 App 行为是否不同
如果参数被替换,服务器响应通常会不同。
这是判断规则是否生效的直接方式。
七、处理 Base64 编码的请求体
如果请求体为二进制数据:
request.IsBase64Body会为 truerequest.Body为 Base64 字符串
修改时需要:
- 解码 Base64
- 修改数据
- 重新编码
- 保持
IsBase64Body为 true
否则服务器可能拒绝请求。
八、自动重定向接口地址
另一个常见需求是:
- 把生产域名改为测试域名
在拦截器中可以直接修改 URL:
function handleRequest(request) {
request.URL = request.URL.replace(
"api.prod.com",
"api.test.com"
)
return request
}
再次触发请求后,可以在代理记录中看到新地址。
九、自动修改 Header
如果需要统一加调试标识:
function handleRequest(request) {
request.Header["X-Debug"] = "1"
return request
}
保存后,每一次匹配到的请求都会自动带上该 Header。
自动修改请求的意义在于:
- 模拟不同服务端返回条件
- 验证客户端分支逻辑
- 在后端未准备完成前进行联调
每一条规则都应该能通过抓包记录验证。