Charles修改Header参数全指南:从抓包到Mock测试实战

1次阅读
没有评论

共计 2601 个字符,预计需要花费 7 分钟才能阅读完成。

image.webp

背景痛点:为什么需要修改 Header 参数

在 API 开发和调试过程中,修改 HTTP 请求和响应的 Header 参数是一个常见的需求。以下是一些典型的场景:

Charles 修改 Header 参数全指南:从抓包到 Mock 测试实战

  • 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

  1. 打开 Charles,确保已开始抓包(Proxy > Start Recording)
  2. 进入 Proxy > Breakpoints Settings
  3. 点击 ”Add”,输入要拦截的 URL(支持 * 通配符)
  4. 勾选 ”Request” 和 ”Response” 选项

此时,匹配的请求会被暂停,等待我们修改。

2. 使用正则表达式匹配特定 Header

在 Breakpoints 触发时,我们可以:

  1. 在 ”Edit Request” 窗口找到 Headers 选项卡
  2. 点击要修改的 Header(如 Authorization)
  3. 使用正则表达式进行匹配替换,例如:
    Bearer \w+ → Bearer new_token_value

3. 保存修改后的 Session

修改完成后,可以:

  1. 右键点击请求记录
  2. 选择 ”Export” > “Charles Session File”
  3. 保存为.chls 文件以便后续复用

避坑指南:常见问题解决方案

HTTPS 抓包问题

如果无法捕获 HTTPS 请求:

  1. 安装 Charles 根证书(Help > SSL Proxying > Install Charles Root Certificate)
  2. 在 Proxy > SSL Proxying Settings 中添加要抓包的域名

Content-Length 头问题

手动修改请求体后,必须:

  1. 删除原始的 Content-Length 头
  2. Charles 会自动计算并添加正确的 Content-Length

签名校验场景

如果服务端对 Header 进行签名校验:

  1. 先正常完成一次请求,记录所有参与签名的 Header
  2. 修改时保持签名相关 Header 不变
  3. 或使用 Rewrite 功能动态重新计算签名

进阶技巧

Map Local 批量替换

  1. 准备一个包含目标 Header 的本地文件
  2. Tools > Map Local > Add
  3. 设置 URL 匹配规则和本地文件路径

动态 Token 注入

使用 Rewrite 功能:

  1. Tools > Rewrite > Add
  2. 设置匹配规则
  3. 添加 ”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 的自动化测试流程?

你可以尝试:

  1. 使用 Rewrite 功能自动刷新 Access Token
  2. 配合 Map Local 模拟授权服务器响应
  3. 将 Charles 配置导出为模板,供团队共享

点击下载本文用到的 Charles 配置模板 (示例链接)

通过灵活运用 Charles 的这些功能,可以显著提升 API 开发和测试的效率,特别是在需要频繁修改 Header 参数的复杂场景下。

正文完
 0
评论(没有评论)