共计 1465 个字符,预计需要花费 4 分钟才能阅读完成。
技术背景
在实际开发中,修改 HTTP 请求的 Header 参数是接口调试的常见需求。例如:
- 测试不同权限的接口访问,需要动态切换 Authorization 头
- 多环境切换时修改 Host 或 X -Env 标记
- 模拟移动设备请求时修改 User-Agent
- 测试签名校验逻辑时需要实时调整签名参数
这些场景如果通过修改代码重新部署的方式验证,效率极低。而 Charles 作为专业的 HTTP 抓包工具,可以实时拦截和修改请求头信息。
工具对比
- Charles:
- 优势:完整的请求拦截和修改能力,支持断点和脚本注入
-
劣势:需要配置 SSL 证书,学习成本略高
-
Postman:
- 优势:适合手动构造请求,界面友好
-
劣势:无法拦截真实客户端发出的请求
-
Fiddler:
- 优势:Windows 平台性能较好
- 劣势:跨平台支持较弱,脚本功能不如 Charles 强大
核心操作
1. 配置 SSL 证书
- 安装 Charles 后,进入菜单栏选择 Help > SSL Proxying > Install Charles Root Certificate
- 在钥匙串访问中找到 Charles 证书,设置为始终信任
- 在 Charles 中启用 SSL 代理:Proxy > SSL Proxying Settings,添加需要抓包的域名

2. 使用 Breakpoints 修改 Header
- 在 Charles 中右键目标请求,选择 Breakpoints
- 重新发起请求,当请求被拦截时,切换到 Edit Request 标签
- 在 Headers 部分添加或修改需要的参数
- 点击 Execute 继续请求
3. Map Local 批量替换
创建配置文件 header-map.json:
{
"//comment": "将所有请求的 X -Debug 头改为 1",
"rules": [
{
"match": {"host": "api.example.com"},
"headers": {"X-Debug": "1"}
}
]
}
在 Charles 的 Tools > Map Local 中导入该配置。
避坑指南
- 证书信任失败
- 现象:iOS 设备提示不受信证书
-
解决:在设备 Safari 中访问 chls.pro/ssl 安装证书,并在设置中手动信任
-
HTTPS 抓包空白
- 现象:只看到 CONNECT 请求没有内容
-
解决:确保正确配置了 SSL 代理设置,且客户端没有禁用代理
-
修改后接口报错
- 现象:修改 Header 后服务端返回 400/403
- 解决:检查是否有签名校验逻辑,需要同步更新签名参数
高级技巧:动态 Header 注入
使用 Charles Script 实现根据响应动态修改后续请求 Header:
function beforeRequest(request) {if(request.host.indexOf("api.example.com") >= 0) {
// 从 session 中获取 token
var token = session.get("authToken");
if(token) {request.headers.add("Authorization", "Bearer" + token);
}
}
}
function afterResponse(response) {
// 登录接口响应中提取 token
if(response.url.indexOf("/login") >= 0) {var token = JSON.parse(response.body).token;
session.set("authToken", token);
}
}
思考题
当需要修改的 Header 参数依赖前序请求响应时(如先获取 token 再用于后续请求),应该如何设计调试流程?建议尝试结合 Charles Script 的 session 功能实现自动化流程。
正文完
