网络捕获(capture)
capture 是 Network 能力的插件入口:HTTP 捕获记录 + JS hook 改写 + 声明式规则。挂在逻辑层与面板层全局上(wadLogicLayer.capture / wadPanelLayer.capture);渲染层的 capture 注册类同步抛错、查询类 Promise.reject(见 三层 API 对比)。hook 契约与改写案例见网络请求与改写;不走 wx.request 的原生 JSAPI 观测与拦截见 Native 观测。
本页你将学到
- capture 在逻辑层与面板层的完整 API 面;
- records 记录的字段结构;
addRule → Promise<{id}>的声明式规则用法;- 实时订阅的两种写法(watch / onNetwork)。
capture 全量
| 方法 | 逻辑层 | 面板 | 说明 |
|---|---|---|---|
capture.intercept.request/response | ✅ | —(无此方法) | JS hook 改写请求/响应,见 网络请求与改写 |
capture.records(n?) | ✅ | ✅ | 最近 n 条(默认 100)请求摘要,Promise<Record[]> |
capture.body(id) | ✅ Promise<{ok, record}> | ✅ Promise<{id, body, bodyB64, mime}> | 按 id 取捕获体(受 96KB 上限,可能 truncated) |
capture.rules() | ✅ 全部规则(含 Network UI 规则) | ✅ 本插件名下规则 | 声明式规则列表 |
capture.addRule(rule) | ✅ | ✅ | 新增声明式规则 → Promise<{id}>(先于 JS hook 执行) |
capture.removeRule(id) | ✅ | ✅ | 删除规则 → Promise |
capture.watch(fn) | ✅ | ✅ | 订阅 network 摘要事件,返回解绑函数 |
capture.clear() | ✅ | ✅ | 清空全局 hook 捕获环(不是只清本插件) |
records(n?)
最近 n 条请求摘要。
- 签名:
records(n?) → Promise<Record[]>(默认 100)
records 字段
text
{
id: 'wm12-34567890', // 请求 id(capture.body / Network 面板用)
url: 'https://…', // 完整 URL(被改写后的)
method: 'GET',
status: 200, // HTTP 状态码(未完成为 0)
at: 1699999999999, // 时间戳
done: true, // 是否已有响应
// —— 以下字段有值时才出现 ——
statusText: 'OK',
mimeType: 'application/json',
size: 1234, // 响应字节数
requestHeaders: {}, responseHeaders: {},
requestBody: '…', // 有请求体时
responseBody: '…', // 已捕获响应体时(capture.body 拿完整版)
rewritten: true, origUrl: '…',// 被规则改写过时
ws: true, frames: [], frameCount: 3 // WebSocket 连接
}body(id)
按 id 取完整记录(含响应体)。
js
(async () => {
// 面板:最近失败请求列表
const records = await wadPanelLayer.capture.records(100);
records.filter(function (r) { return r.status >= 400; }).forEach(function (r) {
wadPanelLayer.log(r.status, r.method, r.url);
});
// 面板:取某个请求的完整记录(含响应体)
const hit = records.find(function (r) { return r.url.indexOf('/api/user') >= 0; });
if (hit) {
const full = await wadPanelLayer.capture.body(hit.id);
wadPanelLayer.log(String(full.body || "").slice(0, 200));
}
})();watch(fn)
实时订阅 network 摘要事件。
- 签名:
watch(fn) → 解绑函数 fn载荷:{id, url, method, status, kind, at, ws?, dir?, len?}- 逻辑层等价钩子糖:
wadLogicLayer.onNetwork(fn)。
js
// 逻辑层/面板都可订阅;面板直连捕获管线,时延最低
const off = wadPanelLayer.capture.watch(function (e) {
if (e.status >= 400) wadPanelLayer.ui.toast('失败 ' + e.status + ' ' + e.url.slice(0, 48));
});on('network') 已移除
on('network') 魔法已移除。订阅网络摘要统一用 capture.watch 或逻辑层 onNetwork。
addRule(rule) / rules() / removeRule(id)
声明式规则:addRule → Promise<{id}>,removeRule → Promise。格式与完整示例见 网络请求与改写 的「声明式改写」一节:match(url contains/regex + method)命中后按 request.* / response.* 动作改写;规则宿主侧持久化,先于所有 JS hook 执行。
js
(async () => {
const rule = await wadPanelLayer.capture.addRule({
match: { url: 'contains:/api/pay' },
response: { setStatus: 200, setBody: '{"code":0}' }
});
await wadPanelLayer.capture.removeRule(rule.id);
})();clear()
清空全局 hook 捕获环(/v1/hook/clear),不是只清本插件。
js
(async () => {
await wadPanelLayer.capture.clear();
})();E_LAYER_ONLY 一览
| API | 逻辑层 | 渲染层 | 面板 |
|---|---|---|---|
capture.intercept.* | ✅ | ✋ 同步抛 | — 无此方法 |
capture.watch | ✅ | ✋ 同步抛 | ✅ |
capture.records / clear | ✅ | ❌ reject | ✅ |
capture.body / rules / addRule / removeRule | ✅ | ❌ reject | ✅ |
注意
- 捕获开关与生命周期:插件订阅 network 时宿主按需开启底层捕获,最后一个订阅者离开(或 detach)自动还原;
- 改写要克制:hook 抛错会让业务请求直接失败,先在
try/catch里兜住再返回; - 想观测 HTTP 用
capture.watch/capture.records; - 声明式规则改不动的再上 JS hook;JS hook 还不行的(加密协议)见 Debugger API 的函数断点改写。
- 插件内部请求自动豁免:插件 SDK 自己的资产拉取、网关查询与
wadLogicLayer.http/wadRenderLayer.http/wadPanelLayer.http请求都带ignore_wmpf_network_debug=1—— 这类请求既不进网络调试记录,也不会被任何 Network 脚本 / 重写规则 / 插件 hook 改写,避免「插件依赖的请求被自己的规则污染」。
下一步
- 网络请求与改写
- Debugger API
- 生命周期与回调:network 投递时序