共计 2601 个字符,预计需要花费 7 分钟才能阅读完成。
背景痛点:为什么需要修改 Header 参数
在 API 开发和调试过程中,修改 HTTP 请求和响应的 Header 参数是一个常见的需求。以下是一些典型的场景:

- JWT 调试 :需要修改 Authorization 头来测试不同的用户权限
- 跨域测试 :模拟不同的 Origin 头来测试 CORS 策略
- UA 检测 :修改 User-Agent 测试不同设备的响应
- 签名校验 :测试服务端对篡改 Header 的检测能力
浏览器开发者工具虽然可以查看 Header,但修改能力有限;Postman 虽然可以设置 Header,但无法拦截和修改实际的网络请求。这就是为什么我们需要 Charles 这样的专业抓包工具。
工具对比:为什么选择 Charles
常见的抓包工具有 Fiddler、Charles 和 Wireshark,它们在 Header 修改方面的能力对比如下:
- Fiddler:功能强大但配置复杂,Windows 平台为主
- Wireshark:底层抓包能力强,但 HTTP 层操作不便
- Charles:
- 跨平台支持(macOS/Windows/Linux)
- 直观的 GUI 界面
- 强大的 Breakpoints(断点)功能
- Map Local/Remote 特性
Charles 的 Map 功能可以批量替换 Header,而 Breakpoints 则允许我们在请求 / 响应被发送前进行实时修改,这两种特性使其成为 Header 修改的理想工具。
核心实现:修改 Header 的详细步骤
1. 设置 Breakpoints
- 打开 Charles,确保已开始抓包(Proxy > Start Recording)
- 进入 Proxy > Breakpoints Settings
- 点击 ”Add”,输入要拦截的 URL(支持 * 通配符)
- 勾选 ”Request” 和 ”Response” 选项
此时,匹配的请求会被暂停,等待我们修改。
2. 使用正则表达式匹配特定 Header
在 Breakpoints 触发时,我们可以:
- 在 ”Edit Request” 窗口找到 Headers 选项卡
- 点击要修改的 Header(如 Authorization)
- 使用正则表达式进行匹配替换,例如:
Bearer \w+ → Bearer new_token_value
3. 保存修改后的 Session
修改完成后,可以:
- 右键点击请求记录
- 选择 ”Export” > “Charles Session File”
- 保存为.chls 文件以便后续复用
避坑指南:常见问题解决方案
HTTPS 抓包问题
如果无法捕获 HTTPS 请求:
- 安装 Charles 根证书(Help > SSL Proxying > Install Charles Root Certificate)
- 在 Proxy > SSL Proxying Settings 中添加要抓包的域名
Content-Length 头问题
手动修改请求体后,必须:
- 删除原始的 Content-Length 头
- Charles 会自动计算并添加正确的 Content-Length
签名校验场景
如果服务端对 Header 进行签名校验:
- 先正常完成一次请求,记录所有参与签名的 Header
- 修改时保持签名相关 Header 不变
- 或使用 Rewrite 功能动态重新计算签名
进阶技巧
Map Local 批量替换
- 准备一个包含目标 Header 的本地文件
- Tools > Map Local > Add
- 设置 URL 匹配规则和本地文件路径
动态 Token 注入
使用 Rewrite 功能:
- Tools > Rewrite > Add
- 设置匹配规则
- 添加 ”Set Header” 规则,Value 可以使用函数动态生成
与自动化测试集成
可以将 Charles 作为代理服务器,在测试脚本中配置:
import requests
proxies = {
'http': 'http://localhost:8888',
'https': 'http://localhost:8888'
}
response = requests.get('https://api.example.com', proxies=proxies)
Python 示例:解析 Charles Session 文件
import plistlib
from typing import Dict, Any
def parse_chls_file(file_path: str) -> Dict[str, Any]:
"""解析 Charles Session 文件"""
try:
with open(file_path, 'rb') as f:
# Charles Session 文件实际上是 plist 格式
data = plistlib.load(f)
# 提取请求信息
transactions = data.get('transactions', [])
for transaction in transactions:
request = transaction.get('request', {})
headers = request.get('headers', {})
# 这里可以添加修改 Header 的逻辑
if 'Authorization' in headers:
headers['Authorization'] = 'Bearer modified_token'
# 返回修改后的数据
return {'status': 'success', 'data': data}
except FileNotFoundError:
return {'status': 'error', 'message': 'File not found'}
except Exception as e:
return {'status': 'error', 'message': str(e)}
# 使用示例
result = parse_chls_file('session.chls')
if result['status'] == 'success':
print('Session parsed successfully')
else:
print(f"Error: {result['message']}")
思考与延伸
本文介绍了 Charles 修改 Header 的基本方法和进阶技巧。留一个思考题:如何用 Charles 实现 OAuth2.0 的自动化测试流程?
你可以尝试:
- 使用 Rewrite 功能自动刷新 Access Token
- 配合 Map Local 模拟授权服务器响应
- 将 Charles 配置导出为模板,供团队共享
点击下载本文用到的 Charles 配置模板 (示例链接)
通过灵活运用 Charles 的这些功能,可以显著提升 API 开发和测试的效率,特别是在需要频繁修改 Header 参数的复杂场景下。
正文完
