Charles Proxy 以中间人(man-in-the-middle)代理的方式工作,抓取客户端应用与目标服务器之间的全部网络流量,并允许对其进行检查和修改,从而简化 HTTP 请求的调试。
Charles Proxy 作为本地 HTTP 代理服务器运行,让开发者和 QA 工程师能够观察、拦截并操控网络通信。这项能力对于理解客户端与服务器的交互、诊断集成问题、测试边界情况以及验证 API 行为至关重要,尤其是在使用或开发与上游代理交互的服务时。
配置 Charles Proxy
安装与首次启动
从官方网站下载并安装 Charles Proxy。首次启动时,Charles 通常会尝试将自己设置为系统代理。接受该提示,Charles 便可拦截那些遵循系统代理设置的应用的流量。
配置系统代理设置
Charles 运行时会自动将系统的 HTTP/HTTPS 代理设置为 127.0.0.1(localhost)的 8888 端口(默认)。包括浏览器在内的多数应用都会遵循该设置。
如需验证或手动配置:
* macOS: 系统设置 > 网络 > Wi-Fi/以太网 > 详细信息 > 代理。确认 "Web Proxy (HTTP)" 和 "Secure Web Proxy (HTTPS)" 已启用并指向 127.0.0.1:8888。
* Windows: 设置 > 网络和 Internet > 代理 > 手动设置代理。确认"使用代理服务器"已启用,地址为 127.0.0.1,端口为 8888。
* Linux(GNOME): 设置 > 网络 > 网络代理。将方式设为"手动",并把 HTTP/HTTPS 代理配置为 127.0.0.1:8888。
配置客户端应用
部分应用,特别是命令行工具或某些 SDK,可能不遵循全局系统代理设置。此时需要直接为该应用配置代理。
示例:带代理的 curl
curl -x http://127.0.0.1:8888 https://api.example.com/data
示例:带代理的 Node.js axios
const axios = require('axios');
axios.get('https://api.example.com/data', {
proxy: {
host: '127.0.0.1',
port: 8888
}
})
.then(response => {
console.log(response.data);
})
.catch(error => {
console.error(error);
});
HTTPS 流量的 SSL Proxying
要检查 HTTPS 流量,Charles Proxy 必须执行 SSL(或 TLS)代理。其原理是:Charles 为目标域名生成并签发证书,将其提供给客户端,然后自己与真实服务器建立安全连接。
安装 Charles 根证书
客户端应用必须信任 Charles 的根证书,SSL 代理才能在没有安全警告的情况下正常工作。
- 桌面浏览器/系统:
- 依次打开
Help > SSL Proxying > Install Charles Root Certificate。按照各操作系统的提示,将证书安装到系统的受信任根证书存储中。
- 依次打开
- 移动设备:
- 将移动设备配置为使用 Charles 作为 HTTP 代理(例如
your_mac_ip:8888)。 - 在设备上访问
chls.pro/ssl,按提示下载并安装证书。
- 将移动设备配置为使用 Charles 作为 HTTP 代理(例如
为特定主机启用 SSL Proxying
安装根证书后,为你想要检查的特定主机启用 SSL 代理。
- 打开
Proxy > SSL Proxying Settings...。 - 点击 "Add"。
- 输入
Host(例如api.example.com、通配写法*.example.com,或用*表示所有主机)和Port(HTTPS 通常为443,或用*表示所有端口)。 - 点击 "OK",然后再次点击 "OK"。
指定主机的流量现在会被解密,并可在 Charles 中查看。
核心调试功能
流量监控与过滤
"Structure" 和 "Sequence" 视图会显示抓取到的请求。
* Sequence View: 按时间顺序显示请求。
* Structure View: 按主机和路径组织请求。
若要聚焦相关流量:
* 过滤框: 使用 Charles 窗口顶部的过滤框匹配 URL、主机或内容。
* Focus 工具: 右键点击某个请求并选择 "Focus",即可在当前视图中隐藏其他所有主机。
* Record 按钮: 切换录制按钮(红色圆点)以开始/停止抓取流量。
断点(Breakpoints)
断点允许你在请求发送到服务器之前、或响应发送到客户端之前将其暂停并修改。
- 打开
Proxy > Breakpoints Settings...。 - 为请求或响应点击 "Add"。
- 指定
Host和Path(例如/login)。 - 当请求/响应匹配时,Charles 会暂停,并出现 "Breakpoints" 标签页。
- 修改请求头、查询参数或正文。
- 点击 "Execute" 发送修改后的请求/响应。
Rewrite 工具
Rewrite 工具可对请求和响应进行自动化、持久化的修改。它适合在无需手动干预的情况下模拟特定的服务器行为或客户端状态。
- 打开
Tools > Rewrite...。 - 启用 Rewrite 并添加一个新的 "Set"。
- 使用
Host和Path添加 "Locations"(规则适用的 URL)。 - 在该 set 中添加 "Rules":
- Add Header/Remove Header: 修改 HTTP 请求头。
- Change Query Parameter: 修改 URL 查询参数。
- Body Replace: 在请求/响应正文中查找并替换文本。
- URL Replace: 修改请求 URL 的部分内容。
示例:修改 API 响应正文
一条 Rewrite 规则可以把 JSON 响应中的 {"status": "active"} 替换为 {"status": "maintenance"},以测试客户端如何处理不同状态。
Map Local / Map Remote
这些工具会把请求重定向到其他来源。
-
Map Local: 用本地文件代替远程响应返回给客户端。
- 打开
Tools > Map Local...。 - 启用 Map Local 并添加一条新条目。
- 指定远程 URL 的
Host和Path。 - 选择要返回的本地
File路径。
这适合快速测试 UI 改动,或在不改动后端的情况下模拟特定的 API 响应。
- 打开
-
Map Remote: 把发往某个 URL 的请求重定向到完全不同的 URL。
- 打开
Tools > Map Remote...。 - 启用 Map Remote 并添加一条新条目。
- 指定原始请求的
Host和Path。 - 为重定向后的请求指定新的
Host和Path。
适合把 API 调用重定向到预发布环境或本地开发服务器。
- 打开
限速(Throttling)
限速可模拟慢速网络环境,帮助定位性能瓶颈或数据加载缓慢导致的 UI 问题。
- 打开
Proxy > Throttle Settings...。 - 启用 "Enable Throttling"。
- 配置
Bandwidth、Utilisation和Latency参数。 - 也可选择 "Only for selected hosts",并添加需要限速的特定主机。
Repeat / Advanced Repeat
这些功能可以重新发送请求。
- Repeat: 右键点击某个请求并选择 "Repeat",即可立即再次发送。
- Advanced Repeat: 右键点击某个请求并选择 "Advanced Repeat",可按自定义的并发数和迭代次数多次发送。这适合做压力测试或排查竞态条件。
调试上游代理交互
当你的客户端应用配置为使用 Charles,而 Charles 自身又配置为使用上游代理(例如企业代理)时,Charles 便充当中间环节。
将 Charles 配置为使用上游代理:
1. 打开 Proxy > External Proxy Settings...。
2. 启用 "Use external proxy"。
3. 输入上游代理的 Host、Port,以及所需的 Username/Password。
4. 如果上游代理是 SOCKS 代理,请启用 "SOCKS proxy"。
在这种结构下,Charles 先抓取来自客户端的流量,再把它转发给上游代理。这样你就能在流量到达上游代理之前进行检查,这对于诊断上游代理可能修改请求或屏蔽某些端点的问题非常关键。
CHARLES PROXY:通过代理调试 HTTP 请求
Charles Proxy 以中间人(man-in-the-middle)代理的方式调试 HTTP 请求,抓取客户端应用与目标服务器之间的全部网络流量,从而支持细致的检查与修改。
概述
Charles Proxy 是运行在本机上的 HTTP 代理(HTTP/HTTPS/SOCKS)和 HTTP 监控工具。它让你可以查看本机与互联网之间的全部 HTTP 和 HTTPS 流量。在调试与上游代理交互的服务时,可以把 Charles 配置在客户端与上游代理之间,从而清楚看到你的应用实际发送和接收的请求。
初始配置
安装
从官方网站(charlesproxy.com)下载并安装 Charles Proxy。Charles 支持 macOS、Windows 和 Linux。
系统代理配置
启动时,Charles 通常会提示将自己配置为系统代理。接受后,Charles 就能自动拦截那些按系统代理设置运行的应用的流量(例如多数浏览器、Java 应用和 .NET 应用)。
如需手动验证或配置:
* 默认 HTTP/HTTPS 代理地址: 127.0.0.1
* 默认 HTTP/HTTPS 代理端口: 8888
若环境要求 Charles 连接到外部(上游)代理:
1. 打开 Proxy > External Proxy Settings...。
2. 勾选 "Use external proxy"。
3. 输入上游代理的 Host 和 Port。
4. 如果上游代理需要认证,填写 Username 和 Password。
5. 如果上游代理是 SOCKS 代理,勾选 "SOCKS proxy"。
该配置可确保 Charles 先抓取来自客户端的流量,再经指定的外部代理转发,从而让你检查发送给外部代理以及从外部代理接收到的内容。
HTTPS 流量的 SSL Proxying
HTTP Secure(HTTPS)流量是加密的,无法直接检查。Charles 通过 SSL Proxying(中间人攻击)来解密并检查 HTTPS 流量。
安装 Charles 根证书
为了执行 SSL Proxying,Charles 会为每个 HTTPS 域名动态生成 SSL 证书。你的客户端应用必须信任 Charles 的根证书,才能避免 SSL 错误。
- 桌面操作系统(macOS/Windows/Linux):
- 打开
Help > SSL Proxying > Install Charles Root Certificate。 - 按照操作系统的提示,将证书安装到受信任根证书存储中。
- 打开
- 移动设备(iOS/Android):
- 在移动设备的 Wi-Fi 设置中,将 Charles 配置为 HTTP 代理(Charles 的 IP 地址和 8888 端口)。
- 在移动设备上打开浏览器并访问
chls.pro/ssl。 - 按提示下载并将 Charles 根证书安装为受信任凭据。
为特定主机启用 SSL Proxying
安装根证书后,指定 Charles 需要解密哪些 HTTPS 主机。
1. 打开 Proxy > SSL Proxying Settings...。
2. 点击 "Add"。
3. 输入 Host(例如 api.yourdomain.com、*.yourdomain.com,或用 * 表示所有主机)和 Port(通常为 443,或用 * 表示所有端口)。
4. 点击 "OK"。
核心调试能力
流量抓取与过滤
Charles 用两种主要视图显示抓取到的流量:
* Sequence: 按时间顺序排列的请求列表。
* Structure: 按主机和目录路径分组的层级视图。
若要定位特定请求:
* 过滤框: 使用顶部的过滤栏按主机、URL 路径或内容搜索。
* Focus 工具: 右键点击某个请求并选择 "Focus",即可在当前视图中隐藏其他所有主机。
* Record 按钮: 切换红色圆点图标以开始/停止抓取流量。
断点(Breakpoints)
断点允许你在请求发送前手动拦截并修改请求,或在响应到达客户端前修改响应。
- 打开
Proxy > Breakpoints Settings...。 - 为 "Request" 或 "Response" 断点点击 "Add"。
- 为目标 URL 指定
Host和Path匹配规则。 - 当出现匹配的请求/响应时,Charles 会暂停并显示 "Breakpoints" 标签页。
- 修改
Headers、Query Parameters或Body内容。 - 点击 "Execute",以修改后的内容继续该次事务。
Rewrite 工具
Rewrite 工具可根据预设规则自动修改请求和响应。它适合在无需手动干预的情况下执行一致的测试场景。
- 打开
Tools > Rewrite...。 - 启用 Rewrite 并添加一个新的 "Set"。
- 使用
Host和Path定义 "Locations"(规则生效的 URL)。 - 在该 set 中添加 "Rules":
- Type:
Add Header、Remove Header、Change Query Parameter、Host、Path、URL、Body。 - Action: 为该修改指定
Value或Regex。
- Type:
示例:模拟 API 版本变更
一条 Rewrite 规则可以把发往某个特定 API 端点的所有请求的 Accept 请求头由 application/json;v=1 改为 application/json;v=2。
Map Local / Map Remote
这些功能会把请求重定向到替代资源。
-
Map Local: 用本地文件代替远程服务器的响应。
- 打开
Tools > Map Local...。 - 启用 Map Local 并添加一条新条目。
- 指定要映射的远程 URL 的
Host和Path。 - 选择 Charles 应返回的文件的
Local Path。
这在前端开发中很有用:无需改动后端,就能用特定的模拟数据测试 UI 改动。
- 打开
-
Map Remote: 把某个 URL 的请求重定向到完全不同的 URL。
- 打开
Tools > Map Remote...。 - 启用 Map Remote 并添加一条新条目。
- 指定原始请求的
Host和Path。 - 指定新目标 URL 的
Host和Path。
这适合把生产环境的 API 调用重定向到预发布环境或本地开发服务器。
- 打开
限速(Throttling)
限速可模拟各种网络状况(例如拨号、3G、自定义速度),用于测试应用在网络连接不佳时的性能和响应速度。
- 打开
Proxy > Throttle Settings...。 - 勾选 "Enable Throttling"。
- 选择一个
Preset,或手动配置Bandwidth、Utilisation和Latency。 - 也可勾选 "Only for selected hosts",并添加需要限速的特定主机。
Repeat / Advanced Repeat
这些功能可以重新发送请求。
* Repeat: 在 Charles 会话中右键点击某个请求并选择 "Repeat",即可重新发送一次。
* Advanced Repeat: 右键点击某个请求并选择 "Advanced Repeat",可配置重复次数、并发数和延迟,适合做基础压力测试或验证幂等性。
