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

1次阅读
没有评论

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

image.webp

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

在 API 开发中,修改 Header 参数是常见需求,尤其是在以下场景中:

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

  • 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

  1. 打开 Charles,确保已开始抓包
  2. 在菜单栏选择 ”Proxy” > “Breakpoint Settings”
  3. 点击 ”Enable Breakpoints”
  4. 在 ”Breakpoints” 列表中添加需要拦截的 URL

2. 设置正则表达式匹配

例如,要修改所有包含 Authorization 头的请求:

^.*Authorization:.*$

3. 修改 Header

当请求被拦截后:

  1. 在 ”Edit Request” 窗口中找到 Headers 选项卡
  2. 修改或添加需要的 Header
  3. 点击 ”Execute” 继续发送请求

4. 保存 Session

修改完成后,可以通过 ”File” > “Save Session” 保存所有请求和修改记录。

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

HTTPS 抓包问题

如果遇到 HTTPS 请求无法解密的情况:

  1. 确保已在设备上安装 Charles 根证书
  2. 在 Charles 的 ”Proxy” > “SSL Proxying Settings” 中添加需要解密的域名
  3. 检查设备时间是否正确(证书校验依赖系统时间)

Content-Length 问题

手动修改请求体后,Content-Length 不会自动更新,需要:

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

签名校验问题

如果 API 使用 Header 签名校验:

  1. 先正常完成一次请求,记录所有参与签名的 Header
  2. 修改 Header 后,需要重新计算签名
  3. 可以使用 Charles 的 Rewrite 功能自动完成签名计算

进阶技巧

Map Local 批量替换

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

动态 Token 注入

使用 Rewrite 功能:

  1. 选择 ”Tools” > “Rewrite”
  2. 添加规则:当 Header 匹配某条件时,替换为新的 Token
  3. 可以设置 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 文件

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