1. Charles Proxy 抓包工具基础解析
Charles Proxy 是一款在开发者圈子里广泛使用的网络抓包工具,我从业十年来几乎每天都会用到它。本质上它是一个运行在你本地的代理服务器,能够拦截并记录所有经过它的 HTTP/HTTPS 网络请求。与 Fiddler 这类工具相比,Charles 的界面更加现代化,对 JSON/XML 数据的格式化展示也更为友好。
注意:虽然 Charles 提供免费试用,但 30 分钟后会自动断开,重启后才能继续使用。长期使用者建议购买授权(个人版约 50 美元),否则每次重启都会丢失之前的抓包记录。
它的核心工作原理是典型的 MITM(Man-in-the-Middle)中间人模式:
- 你的设备将 Charles 设置为系统/浏览器代理
- 所有网络请求先发送到 Charles
- Charles 记录请求后转发给目标服务器
- 服务器响应先返回给 Charles
- Charles 记录响应后返回给你的设备
这种设计使得 Charles 能够:
- 完整记录请求/响应头、body、时间戳等元数据
- 支持 HTTPS 流量解密(需安装 Charles 根证书)
- 修改请求参数或响应内容进行调试
- 模拟慢速网络测试应用表现
2. 核心功能深度剖析
2.1 流量监控与记录
启动 Charles 后,默认会显示"Sequence"视图,这里按时间顺序展示所有捕获的请求。我习惯使用"Structure"视图(左上角可切换),它会按域名分组显示请求,调试 API 时更加清晰。
几个实用技巧:
- 右键请求 → Focus 可以过滤只显示该域名的请求
- 使用 Filter 输入框快速搜索特定 URL
- 双击请求查看详细内容时,注意这几个标签页:
- Overview:基础信息(状态码、耗时等)
- Contents:格式化后的请求/响应体(自动识别 JSON/XML)
- Summary:流量统计(大小、耗时)
- Chart:时序图(可视化各请求依赖关系)
重要:首次使用时,需要在移动设备或浏览器安装 Charles 根证书才能解密 HTTPS 流量。具体路径:Help → SSL Proxying → Install Charles Root Certificate。
2.2 断点调试与修改
这是 Charles 最强大的功能之一。通过设置断点,可以:
- 拦截指定请求
- 修改请求参数(如 POST 数据)
- 查看服务器原始响应
- 修改响应内容
- 放行请求继续流程
具体操作:
- 右键目标请求 → Enable Breakpoints
- 再次触发该请求时会被暂停
- 在"Edit Request"标签页修改参数
- 点击"Execute"发送修改后的请求
- 在"Edit Response"标签页修改返回数据
- 点击"Execute"继续流程
实测案例:调试支付接口时,我常用这个方法:
- 修改金额参数测试不同支付场景
- 修改返回状态码测试客户端异常处理
- 注入错误信息测试前端展示逻辑
2.3 流量重定向与映射
开发中经常需要将线上请求指向本地环境进行调试,Charles 提供三种方式:
2.3.1 Map Remote
将特定请求重定向到另一个远程地址。例如:
- 将
api.example.com/v1/user 映射到 test.api.com/v1/user
- 配置路径:Tools → Map Remote → 添加规则
2.3.2 Map Local
更常用的方式是将请求映射到本地文件。我经常这样调试前端:
- 保存线上接口响应为本地 JSON 文件
- 配置映射规则(如
api/login → ~/mock/login.json)
- 修改本地文件即可立即生效
2.3.3 Rewrite
动态修改请求/响应内容(无需断点)。典型场景:
- 给所有请求添加调试头信息
- 修改响应中的特定字段值
- 隐藏敏感数据(如手机号脱敏)
3. 移动端抓包实战指南
3.1 Android 设备配置
- 确保电脑和手机在同一 WiFi
- 查看电脑本地 IP(Charles → Help → Local IP Address)
- 手机 WiFi 设置手动代理:
- 主机名:电脑 IP
- 端口:8888(Charles 默认端口)
- 手机浏览器访问
chls.pro/ssl 下载安装证书
- 在手机设置中信任该证书(位置因系统版本而异)
3.2 iOS 设备配置
- 同上设置 WiFi 代理
- 访问
chls.pro/ssl 安装证书
- 进入"设置 → 通用 → 关于本机 → 证书信任设置"
- 启用 Charles 证书的完全信任
3.3 常见问题排查
- 看不到 HTTPS 请求:确认已安装证书并启用 SSL Proxying(右键域名 → Enable SSL Proxying)
- 连接被拒绝:检查电脑防火墙是否放行 8888 端口
- 证书不受信任:尝试重新下载安装,注意 iOS 需要额外信任操作
- Android 7+ 抓包失败:需要将证书安装到系统证书区(需 root)
4. 高级功能应用场景
4.1 性能优化分析
使用"Timing"面板可以:
- 分析每个请求的 DNS 查询、连接、SSL 握手、等待响应、下载耗时
- 识别慢请求(我通常关注超过 500ms 的请求)
- 检查是否有不必要的重定向
- 评估 CDN 效果
4.2 接口 Mock 方案
结合 Map Local 和 Repeat 功能可以实现:
- 保存真实接口响应为模板
- 修改需要测试的字段值
- 设置自动重复请求(右键 → Repeat Advanced)
- 观察前端对不同数据的处理
4.3 自动化测试集成
Charles 支持导出会话为 .chls 文件,可以:
- 录制正常流程的请求序列
- 导出为测试用例
- 使用命令行工具重放:
bash复制charles -headless -config my.conf -session-file test.chls
- 对比实际响应与预期结果
5. 实际开发中的经验技巧
5.1 过滤无关流量
当抓取到大量浏览器背景请求时,可以:
- 使用 Include 列表只显示目标域名
- 启用"Recording Settings"中的"Exclude"规则过滤静态资源
- 对目标域名右键 → Focus 快速聚焦
5.2 批量修改请求
使用"Rewrite"功能时,可以:
- 创建规则组管理不同环境的配置
- 使用正则表达式匹配多个路径
- 导出/导入规则方便团队共享
5.3 安全注意事项
- 抓包结束后记得关闭系统代理
- 敏感数据使用"Protect"功能自动打码
- 定期清理旧的会话记录(尤其含敏感信息的)
- 不要在生产环境长期开启 Charles
我在实际项目中总结的最佳实践是:为每个调试任务创建单独的 Charles 会话(Session → New Session),用有意义的名称保存(如"用户登录调试-20240315"),这样既方便回溯也不会混淆不同任务的记录。