共计 2322 个字符,预计需要花费 6 分钟才能阅读完成。
背景痛点:为什么我们需要修改 Header 参数?
在 API 开发中,修改 Header 参数是常见需求,尤其是在以下场景中:

- JWT 调试 :需要修改 Authorization 头来测试不同权限的接口访问
- 跨域测试 :需要修改 Origin 或 CORS 相关 Header 来模拟不同域名的请求
- 签名校验 :需要修改签名相关的 Header 来测试服务端的校验逻辑
- 设备模拟 :需要修改 User-Agent 来测试不同设备的响应
浏览器开发者工具虽然可以查看 Header,但修改能力有限;Postman 虽然可以设置 Header,但无法拦截和修改现有请求。这就是 Charles 这类抓包工具的价值所在。
工具对比:Fiddler vs Charles vs Wireshark
三种常见抓包工具在 Header 修改方面的对比:
- Fiddler:
- 优点:免费,脚本扩展能力强
-
缺点:界面不够直观,HTTPS 配置复杂
-
Charles:
- 优点:界面友好,Breakpoints 功能强大
-
缺点:收费软件,高级功能需要授权
-
Wireshark:
- 优点:底层抓包能力强
- 缺点:操作复杂,不适合日常 API 调试
Charles 的 Map Local/Remote 和 Breakpoints 特性使其成为修改 Header 的首选工具。
核心实现:使用 Breakpoints 修改 Header
1. 启用 Breakpoints
- 打开 Charles,确保已开始抓包
- 在菜单栏选择 ”Proxy” > “Breakpoint Settings”
- 点击 ”Enable Breakpoints”
- 在 ”Breakpoints” 列表中添加需要拦截的 URL
2. 设置正则表达式匹配
例如,要修改所有包含 Authorization 头的请求:
^.*Authorization:.*$
3. 修改 Header
当请求被拦截后:
- 在 ”Edit Request” 窗口中找到 Headers 选项卡
- 修改或添加需要的 Header
- 点击 ”Execute” 继续发送请求
4. 保存 Session
修改完成后,可以通过 ”File” > “Save Session” 保存所有请求和修改记录。
避坑指南:常见问题解决方案
HTTPS 抓包问题
如果遇到 HTTPS 请求无法解密的情况:
- 确保已在设备上安装 Charles 根证书
- 在 Charles 的 ”Proxy” > “SSL Proxying Settings” 中添加需要解密的域名
- 检查设备时间是否正确(证书校验依赖系统时间)
Content-Length 问题
手动修改请求体后,Content-Length 不会自动更新,需要:
- 删除原有的 Content-Length 头
- Charles 会自动计算并添加正确的 Content-Length
签名校验问题
如果 API 使用 Header 签名校验:
- 先正常完成一次请求,记录所有参与签名的 Header
- 修改 Header 后,需要重新计算签名
- 可以使用 Charles 的 Rewrite 功能自动完成签名计算
进阶技巧
Map Local 批量替换
- 准备一个包含目标 Header 的本地文件
- 在 Charles 中选择 ”Tools” > “Map Local”
- 设置 URL 匹配规则和本地文件路径
动态 Token 注入
使用 Rewrite 功能:
- 选择 ”Tools” > “Rewrite”
- 添加规则:当 Header 匹配某条件时,替换为新的 Token
- 可以设置 Token 从环境变量或外部文件读取
自动化测试集成
Charles 支持导出 cURL 命令,可以集成到测试脚本中。
Python 示例:解析 Charles Session 文件
import json
from typing import Dict, List
def modify_headers_in_session(session_file: str, header_rules: Dict[str, str]) -> None:
"""
修改 Charles Session 文件中的 Header
:param session_file: .chls 文件路径
:param header_rules: 需要修改的 Header 规则 {原 Header: 新 Header}
"""
try:
with open(session_file, 'r', encoding='utf-8') as f:
session_data = json.load(f)
for entry in session_data.get('entries', []):
request = entry.get('request', {})
headers = request.get('headers', [])
for i, header in enumerate(headers):
name = header.get('name', '')
if name in header_rules:
headers[i]['value'] = header_rules[name]
with open(session_file, 'w', encoding='utf-8') as f:
json.dump(session_data, f, indent=2)
except Exception as e:
print(f"Error processing session file: {e}")
if __name__ == "__main__":
# 示例:修改所有 Authorization 头
rules = {"Authorization": "Bearer new_token_123"}
modify_headers_in_session("session.chls", rules)
思考题与资源
思考题 :如何用 Charles 实现 OAuth2.0 的自动化测试流程?
提示:可以考虑结合 Refresh Token 自动获取新 Access Token,并使用 Rewrite 功能动态注入。
资源下载 :
– Charles 配置模板
– 示例 Session 文件
正文完
发表至: 未分类
近两天内
