网络与请求
小程序发请求走 native 的 Cronet,不走 fetch。所以在网页层注入脚本是拦不到请求的 —— 这也是为什么很多人在官方工具里看到 Network 面板一条都没有。
WeAppDev 把捕获点放在更下面:请求出栈之前、响应回来之后,各留一份快照,再翻译成标准 Network.* 事件。
两条捕获链路
| 链路 | 覆盖范围 | 说明 |
|---|---|---|
| 逻辑层 | wx.request / uploadFile / downloadFile | 在业务 JS 上下文里包一层,记录参数与 Error.stack |
| Native | Cronet 边界 | 请求/响应各留一份,包含跨域、XHR、WebSocket |
两条链路同源汇总到 App 的「网络调试」页,也会同步给 Chrome 的 Network 面板。
手机端网络页
从首页的「网络调试」进入,页面会显示:
- 请求方法、域名、路径;
- 状态码与颜色标记(2xx 绿 / 3xx 蓝 / 4xx 橙 / 5xx 红);
- 响应体大小与耗时;
- WebSocket 帧数与方向;
- 顶部搜索、域名筛选、清空。
点开一条记录可以看完整的请求头、响应头、响应体。二进制响应体会标出类型,不会把乱码直接铺在页面上。
捕获开关
网络捕获默认跟随调试通道。关闭调试后,页面仍可打开,但不会再产生新记录。这样你可以随时退回到「什么都没发生」的状态。
Chrome Network 面板
连接 CDP 之后,Chrome 的 Network 面板会收到标准事件:
requestWillBeSentresponseReceivedloadingFinished/loadingFailedwebSocketFrameReceived/webSocketFrameSent
initiator 里带有调用栈,可以直接跳转到发起请求的源码行。
改包与 mock
网络页有两套独立工具:
- 脚本:
onRequest/onResponse,用 JS 改请求与响应; - 重写:不写代码,按 URL / 方法 / 状态码命中,替换、修改、重定向。
详见 Network 脚本与重写。下面是规则的能力概览。
规则按顺序匹配 URL、方法、状态码,命中后可以:
// 响应侧
{
match: { url: 'contains:/api/vip/check' },
response: {
setBody: '{"code":0,"vip":true}',
setStatus: 200,
setHeader: { 'x-debug': '1' }
}
}
// 请求侧
{
match: { url: 'prefix:https://api.old.com' },
request: {
setUrl: 'https://api.new.com/v2/check',
setHeader: { 'x-shadow': '1' }
}
}插件里也可以用同一套能力,见 抓包与改包 API。
规则的作用域
规则保存在 App 内,对之后打开的小程序仍然生效,直到手动删除或卸载插件。卸载插件时,宿主会清掉该插件名下的全部规则。
域名与 TLS
小程序的合法域名校验可以在「开发配置」里绕过,等价于官方工具的「不校验合法域名、web-view 域名、TLS 版本以及 HTTPS 证书」。
这项开关只影响当前 App 内的小程序网络请求,不会改动系统代理或安装证书。
能抓到什么,抓不到什么
能:
- 当前小程序发出的 HTTP / HTTPS 请求;
wx.request的参数与返回值;- 上传、下载的文件大小与耗时;
- WebSocket 的上下行帧;
- 云网关的加密包(可配合 key 恢复解码)。
不能:
- 系统流量、其他 App 的请求;
- 小程序内嵌
web-view里另一个站点的独立请求(属于 WebView 自身); - 未经解密的自定义加密协议(除非你拿到 key)。
常见问题
一条都没有?
确认小程序已经发起过请求;确认捕获开关开启;确认当前小程序没有走独立进程或缓存。
请求有,响应体是空的?
检查是否是 HEAD 请求、204 响应,或响应体超过缓存上限。大文件请在 App 的记录详情里查看。
改了 body 但没生效?
确认规则命中的是响应侧而不是请求侧;确认没有更靠前的规则先命中;重开小程序后再试。