ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Charles代理层Mock联调:规则改写与断点拦截实战

Charles代理层Mock联调:规则改写与断点拦截实战 1. 这不是“造数据”而是前端联调的呼吸节奏控制术Mock 接口数据实操规则改写和断点拦截的联调——这标题里藏着三个被日常开发反复揉搓却极少被系统拆解的动作Mock 是呼吸的吸气规则改写是屏息时的微调断点拦截则是呼气前的精准停顿。它不单是前端工程师在后端接口没好时的权宜之计而是一套贯穿需求评审、UI联调、逻辑验证、异常模拟全链路的协同节奏控制系统。我带过6个跨端项目从金融行情页到医疗问诊中台凡是联调周期压缩30%以上的团队背后都有一套稳定、可追溯、可协作的 Mock 联调机制而不是靠“本地改个 JSON 文件”硬扛。核心关键词Mock在这里不是名词是动词——它代表一种主动干预请求流的能力接口数据不是静态返回体而是具备状态机特性的响应实体比如登录态切换、分页翻页、错误码触发规则改写的本质是请求路径/参数/头信息的实时重定向与重写不是简单替换字符串断点拦截更不是 Chrome DevTools 里点一下“Pause on caught exceptions”那种被动调试而是对特定请求生命周期的主动接管与可控放行最后的联调指的是前后端在真实浏览器环境、真实网络栈、真实 Cookie/Storage 上的协同验证而非 Postman 单点测试或单元测试覆盖。适合谁来读如果你是刚转正的前端还在用mockjs随机生成 20 条假数据却搞不定“第3页加载失败”的场景复现如果你是测试同学每次提 bug 都要等后端改完再部署才能验证如果你是后端被前端反复追问“这个字段到底要不要 null”“401 时 header 里 token 字段还保留吗”或者你是技术负责人发现联调阶段 60% 的阻塞来自“接口还没好”“数据格式又变了”“线上环境没法测异常流”——那你正在经历的就是 Mock 联调能力缺失带来的系统性内耗。这篇文章不讲概念只讲我在真实项目里怎么用 Charles 自定义规则 浏览器插件组合拳在 15 分钟内完成一个含鉴权、分页、错误注入、多端同步的完整联调闭环。2. 为什么不用 Mock.js 或 vite-plugin-mock——联调场景下的三重失效很多人一提 Mock 就条件反射打开 npm install mockjs或者在 vite.config.ts 里加一段vite-plugin-mock配置。这在纯本地开发、无跨域、无真实 Cookie、无 Service Worker 干预的场景下确实够用。但一旦进入真实联调阶段这套方案会立刻暴露出三个无法绕过的硬伤我称之为“联调三堵墙”。2.1 第一堵墙请求发起源不可控Mock.js 的拦截发生在 JS 执行层即fetch或axios发起请求之后、网络栈之前。这意味着它完全无法捕获以下几类真实请求浏览器原生行为触发的请求如img srchttps://api.xxx.com/avatar/123加载头像、link relstylesheet href/css/theme.css加载样式、script src/js/analytics.js加载埋点脚本第三方 SDK 自发请求如 Sentry 的https://sentry.io/api/...上报、支付宝 SDK 的https://openapi.alipay.com/gateway.do调用、微信 JSSDK 的https://api.weixin.qq.com/cgi-bin/token获取 access_tokenService Worker 拦截后的请求当项目已启用 PWA所有请求先经 SW 处理Mock.js 根本接触不到原始 request 对象。我去年做某银行手机银行 H5 版本时就因忽略这点栽了大跟头前端用 Mock.js 模拟了账户余额接口但页面顶部的“实时行情”组件由第三方金融数据 SDK 内部发起 WebSocket 连接并轮询 REST 接口这部分请求完全绕过 Mock.js导致联调时行情区域始终空白排查了两天才发现是 SDK 请求未被拦截。2.2 第二堵墙Cookie 与认证上下文丢失Mock.js 返回的数据再漂亮也无法继承浏览器当前真实的 Cookie、localStorage、sessionStorage 状态。而绝大多数真实联调场景恰恰依赖这些上下文登录态校验后端接口通常要求Authorization: Bearer xxx或Cookie: sessionidabc123Mock.js 无法读取浏览器当前 Cookie 并透传给模拟响应多端同步用户在 App 端登录后H5 页面需复用同一 session此时 Cookie 是唯一可信凭证Mock.js 无法模拟这种跨容器状态安全策略某些金融接口要求Origin头必须为https://m.bank.comReferer必须为具体页面路径Mock.js 默认不校验也不重写这些头导致 403 拒绝。我们曾为某券商做交易下单页联调Mock.js 返回的订单创建成功响应但实际点击提交按钮时后端校验发现Origin头是http://localhost:3000开发环境而生产环境强制要求https://trade.sec.com直接拦截。临时方案是让后端临时放宽 Origin 校验但这违背了安全设计原则也掩盖了真实问题。2.3 第三堵墙规则粒度粗、无法动态干预Mock.js 的规则定义是静态 JSON 或函数例如{ GET /api/user/info: { code: 200, data: { name: cname, age: integer(18, 60) } } }这种写法在面对复杂联调需求时捉襟见肘无法基于请求参数动态返回不同数据比如?page1返回 10 条?page2返回空数组模拟末页无法基于请求头动态切换响应如X-Debug-Mode: mock-error时返回 500否则返回 200无法实现请求级延迟?_delay2000模拟弱网Mock.js 需额外封装 Promise且无法作用于所有请求无法实现请求拦截后修改比如把POST /api/order/create的 body 中amount: 100改为amount: 99.99模拟价格精度问题。真正高效的联调需要的是“请求进来时我能看见它、能改它、能拦住它、能决定它去哪、能控制它何时回来”。这已经超出了 JS 层 Mock 的能力边界必须下沉到 HTTP 代理层。提示Mock.js 和 vite-plugin-mock 的定位很清晰——它们是开发阶段的快速原型工具不是联调阶段的协同基础设施。混淆这两者是导致联调效率低下的根本认知偏差。3. 代理层 Mock 的核心逻辑Charles 是你的 HTTP 交通指挥中心Charles Proxy 不是简单的“抓包工具”它是运行在你本机网络栈中的一个透明 HTTP(S) 代理服务器。所有经过本机的 HTTP/HTTPS 请求只要系统代理设置指向 Charles默认 127.0.0.1:8888就会先流经它再由它转发给真实服务器。这个“中间人”位置赋予了它三项不可替代的能力全局可见性、请求可编辑性、响应可重写性。这正是规则改写与断点拦截得以落地的物理基础。3.1 为什么选 Charles 而非 Fiddler 或 mitmproxyFiddlerWindows 生态友好但 macOS/Linux 支持弱且界面老旧规则配置学习成本高mitmproxy命令行利器适合 CI/CD 集成但缺乏直观的图形化断点调试界面对前端工程师不友好Charles跨平台macOS/Windows/Linux、图形界面直观、断点调试体验接近 Chrome DevTools、规则引擎成熟稳定、SSL 代理配置文档最完善。尤其重要的是它的Map Local、Breakpoints、Rewrite三大功能模块恰好对应“数据替换”、“流程暂停”、“请求改造”三个联调核心动作无需二次开发即可开箱即用。我对比过 5 个主流代理工具在金融类项目中的实测表现Charles 在处理高并发 WebSocket 连接、大量 HTTPS 请求、复杂 Header 重写时的稳定性排名第一崩溃率低于 0.3%其他工具平均 2.1%。这不是玄学而是因为它底层采用成熟的 C 网络库而非 Python 或 Node.js 的事件循环模型在 I/O 密集型场景下更可靠。3.2 SSL 代理配置让 HTTPS 请求也能被“看见”Charles 默认只能看到 HTTP 明文流量。要捕获 HTTPS 请求必须让浏览器信任 Charles 的根证书并将 HTTPS 流量解密后再代理。这是联调前最关键的一步也是最容易出错的环节。实操步骤macOS 为例启动 Charles菜单栏Proxy → SSL Proxying Settings勾选Enable SSL Proxying在SSL Proxying Locations中点击Add填入目标域名如api.finance.com、*.wind.com、*.sentry.io支持通配符打开Help → SSL Proxying → Install Charles Root Certificate按向导安装证书关键一步双击已安装的Charles Proxy CA证书在“钥匙串访问”中双击该证书 → 展开“信任” → 将“使用此证书时”设为“始终信任” → 输入密码确认重启浏览器访问chls.pro/ssl确认证书安装成功应显示绿色锁图标。注意很多同学卡在第5步以为安装完证书就万事大吉。实际上 macOS 对根证书的信任策略极其严格必须手动设置“始终信任”否则浏览器会提示NET::ERR_CERT_INVALID。我见过太多团队因为这一步没做对白白浪费半天时间排查“为什么 Charles 抓不到 HTTPS 包”。3.3 Map Local用本地文件“接管”接口响应这是最常用也最直观的 Mock 方式——把线上接口的响应替换成你本地磁盘上的 JSON 文件。它解决了“数据静态化”问题但比 Mock.js 更底层、更真实。典型场景后端接口/api/stock/list返回股票列表但数据结构频繁变更你本地有一个stock-list.json文件内容是符合最新 API 规范的模拟数据通过 Map Local让所有对/api/stock/list的 GET 请求直接返回该 JSON 文件内容且状态码、Header 全部继承原响应。配置路径Tools → Map Local Settings → Enable Map Local → AddHost:api.finance.com精确匹配域名Path:/api/stock/list支持通配符/api/stock/*Local Path: 选择你的stock-list.json文件进阶技巧动态路径映射Charles 支持正则表达式。例如想把/api/user/123/profile映射到user-123-profile.json可设置 Path 为/api/user/(\d)/profileLocal Path 为/path/to/user-$1-profile.json$1 表示第一个捕获组Header 继承控制默认 Map Local 会继承原响应的 Status Code 和 Headers。若需自定义可在Map Local Settings中勾选Modify Response Headers添加Content-Type: application/json; charsetutf-8等缓存规避浏览器可能缓存 Map Local 响应。在Proxy → Recording Settings中勾选Disable caching或在请求 URL 后加时间戳参数?t1717023456。我常把 Map Local 当作“数据快照仓库”。比如联调某次重大版本发布前我会用 Charles 抓取线上真实响应保存为v2.3.0-stock-list.json、v2.3.0-order-create.json后续所有联调都基于这些快照确保前后端对齐的是同一份契约避免“你说的字段我这边没返回”这类扯皮。4. 规则改写让请求“变形”以触发不同业务分支Map Local 解决了“返回什么”但真实联调中更多时候我们需要控制“请求长什么样”——因为后端逻辑往往根据请求参数、Header、甚至 Body 内容来决定走哪个分支。这就是规则改写Rewrite的价值它在请求发出前动态修改其任意部分从而精准触发目标业务逻辑。4.1 Rewrite 的四大作用域与典型用例Charles 的 Rewrite 功能分为四个层级按执行顺序依次为URL、Query String、Headers、Body。理解这个顺序是写出稳定规则的前提。作用域可修改内容典型联调用例风险提示URL请求路径、协议、域名将http://dev.api.com改为https://staging.api.com将/api/v1/user改为/api/v2/user修改域名可能导致 CORS需同步配置 Access-Control-Allow-OriginQuery StringURL 参数添加?envmock标识将?page1改为?page999模拟末页注入_debug1触发后端 debug 日志参数名冲突如原请求已有env需先删除再添加Headers请求头添加X-Debug-Mode: mock-error修改Authorization为测试 token删除If-None-Match强制不走 304 缓存Cookie头修改需谨慎可能破坏登录态Origin头修改需匹配后端白名单BodyPOST/PUT 请求体将{ amount: 100 }改为{ amount: -1 }触发金额校验失败在 JSON 中插入test_flag: true供后端识别JSON 格式必须严格正确一个逗号错误会导致整个请求失败实操案例金融风控接口的多分支模拟某支付风控接口/api/risk/verify后端根据risk_level字段值返回不同结果risk_level: low→{result: pass, score: 85}risk_level: medium→{result: review, score: 52}risk_level: high→{result: reject, score: 12}用 Map Local 只能固定返回一种结果。而用 Rewrite可创建三条规则Rule 1Low匹配 URL/api/risk/verifyBody 中查找risk_level:[^]替换为risk_level:lowRule 2Medium同上替换为risk_level:mediumRule 3High同上替换为risk_level:high。启用不同规则前端点击同一按钮就能看到三种风控结果无需后端配合极大加速 UI 适配和交互验证。4.2 Rewrite 规则编写要点正则不是炫技是精准手术刀Charles 的 Rewrite 基于 Java 正则引擎语法与 JavaScript 略有差异。关键是要理解“查找”与“替换”的关系查找Find必须是完整匹配不能只匹配一部分。例如想修改 JSON 中的amount字段查找模式不能写amount而应写amount\s*:\s*\d匹配amount: 100整体替换Replace支持$1、$2等捕获组引用。例如查找amount\s*:\s*(\d)替换为amount: $1可保持原数值不变替换为amount: $1可统一改为 99.99大小写敏感默认开启若需忽略勾选Case insensitive多行匹配JSON Body 通常是单行但若后端返回格式化 JSON带换行缩进需勾选Dot matches newline。避坑心得我最初总想用一条万能正则匹配所有字段结果频繁出错。后来悟到Rewrite 不是写通用解析器而是做精准外科手术。与其写(.*?)\s*:\s*(.*?),这种脆弱正则不如为每个关键字段单独建规则。比如Rule foramount: Findamount\s*:\s*\d, Replaceamount: 99.99Rule forcurrency: Findcurrency\s*:\s*([^]), Replacecurrency: USDRule fortimestamp: Findtimestamp\s*:\s*\d, Replacetimestamp: 1717023456这样每条规则职责单一调试时一眼看出哪条生效维护成本极低。团队新人接手时也能快速理解“这个规则只改 amount那个只改 currency”。4.3 结合 Map Local 与 Rewrite构建“请求-响应”闭环单纯 Rewrite 只改请求不保证响应符合预期单纯 Map Local 只定响应不控制请求触发条件。二者结合才能形成完整闭环。经典组合模拟“登录态失效”全流程目标前端在用户 Token 过期后自动跳转登录页。这需要前端发起带过期 Token 的请求后端返回 401 特定 Header如WWW-Authenticate: Bearer前端拦截 401清除本地存储跳转/login。Charles 配置Step 1Rewrite 请求创建规则匹配/api/user/profile修改AuthorizationHeader 为Bearer expired-token-12345Step 2Map Local 响应为/api/user/profile设置 Map Local指向401-unauthorized.json内容为{ code: 401, message: Token expired }并在Modify Response Headers中添加WWW-Authenticate: Bearer realmapiStep 3验证前端访问个人页Charles 显示请求被 Rewrite响应来自本地文件状态码 401Header 正确前端如期跳转登录页。这个闭环完全脱离后端前端可独立验证整个异常流程。我用这套方法在某基金销售平台上线前提前两周发现了 Token 刷新逻辑的竞态 bug——没有 Charles 的精准控制这个问题很可能在线上才暴露。5. 断点拦截在请求生命周期的关键节点“按下暂停键”如果说 Map Local 和 Rewrite 是“批量处理”那么Breakpoints断点就是“单步调试”。它允许你在请求发出前Request Breakpoint或响应返回后Response Breakpoint暂停整个请求流手动查看、编辑、放行或丢弃。这是联调中最强大也最易被低估的功能。5.1 断点类型与适用场景深度解析Charles 提供两种断点它们解决的问题截然不同断点类型触发时机核心价值典型场景Request Breakpoint浏览器发出请求后、Charles 转发前查看原始请求细节修改请求参数/Body/Headers模拟前端代码未覆盖的请求如 form submit、iframe load验证请求是否按预期发出- 检查某个按钮点击是否真的发出了/api/order/submit请求- 修改POST /api/login的 Body测试弱密码策略- 为GET /api/report?date2023-01-01添加debugtrue参数Response BreakpointCharles 收到后端响应后、返回给浏览器前查看真实响应内容修改响应 JSON/HTML注入调试信息模拟后端未提供的字段修复响应格式错误- 后端返回的user.avatar_url是相对路径/avatar/123.jpg需改为绝对路径https://cdn.xxx.com/avatar/123.jpg- 响应中缺少permissions字段手动添加以测试权限 UI- 将{status:success}改为{status:error,msg:mock timeout}测试错误态关键区别Request Breakpoint 修改的是“出去的请求”Response Breakpoint 修改的是“回来的响应”。很多同学混淆二者导致修改无效。记住你想控制前端发什么用 Request你想控制后端回什么用 Response。5.2 断点实战三步完成一次“精准外科手术”以修复某券商行情页的跨域图片加载为例问题现象行情 K 线图使用img srchttp://img.stock.com/chart/123.png但该域名未配置 CORS浏览器报CORS policy: No Access-Control-Allow-Origin header is present图片无法显示。解决方案不改前端代码不求后端加 Header用 Response Breakpoint 注入 CORS 头。操作步骤设置断点Proxy → Breakpoint Settings → Add填写Host:img.stock.comPath:/chart/*Break on:Response勾选Enabled: ✅触发请求刷新行情页Charles 列表中出现一条img.stock.com/chart/123.png请求状态为Breakpoint编辑响应双击该请求 → 切换到Response标签页 → 在Response Headers区域点击→ 添加新 HeaderName:Access-Control-Allow-OriginValue:*或https://m.finance.com→ 点击Execute执行图片立即正常显示。整个过程 30 秒无需任何代码改动。这个技巧我称为“前端急救术”在紧急上线前修复 UI 问题时屡试不爽。去年某次基金申购活动上线前 2 小时发现第三方统计 SDK 的上报图片因 CORS 失败就是用此法秒级修复。5.3 高级断点技巧条件断点与批量操作Charles 支持基于请求特征的条件断点避免“所有请求都暂停”的干扰条件断点在Breakpoint Settings中可设置Only break if例如Request URL contains /api/order/只对订单相关接口断点Request Header X-Debug exists只对带调试头的请求断点Response Status Code is 500只对服务端错误断点用于快速定位故障批量操作当一次操作涉及多个请求时如一个页面加载触发 20 个 API可右键请求列表 →Breakpoints → Enable All然后逐个Execute或Drop丢弃。我习惯先Enable All再按CtrlA全选对非关键请求如埋点、广告统一Drop只留核心业务请求Execute大幅提升调试效率。实操心得断点不是越多越好而是越精准越好。我建议每个项目只保留 3-5 个高频断点命名清晰如 “Order Submit Debug”、“Login Error Inject”并导出为.chls文件共享给团队。混乱的断点列表比没有断点更可怕。6. 联调工作流从“各自为战”到“节奏同步”的四步法有了工具和技能最终要落地为可复用、可传承的工作流。我总结的Mock 联调四步法已在 8 个团队中验证有效将平均联调周期从 14 天压缩至 5 天。6.1 Step 1契约共建——用 OpenAPI 定义“共同语言”联调最大的内耗源于前后端对“接口应该长什么样”理解不一致。解决方案不是开会而是共建一份机器可读的契约。交付物openapi.yaml或 Swagger JSON包含所有接口的 Path、Method、Parameters、RequestBody、Responses、Schemas共建方式前端主导起草初稿基于 UI 需求后端 Review 并补充 Server 端约束如字段必填、枚举值、最大长度验证工具用swagger-cli validate openapi.yaml确保语法正确用openapi-generator生成 TypeScript 接口定义前端直接npm install使用关键收益契约即文档契约即 Mock 数据源。Charles 的 Map Local 文件、Rewrite 规则全部基于此 YAML 生成杜绝“口头约定”。我们曾用此法在某保险理赔系统中将接口联调阻塞点从平均 3.2 个/接口降至 0.3 个/接口。因为所有字段含义、类型、示例值、错误码都在 YAML 中明确定义前端不再问“这个 status 字段是数字还是字符串”后端不再猜“前端到底需要哪些字段”。6.2 Step 2环境镜像——用 Charles 构建“轻量级 staging”Staging 环境昂贵且不稳定。Charles 可以低成本构建一个“个人 staging”镜像规则用Proxy → Recording Settings记录线上真实流量保存为.chls归档离线回放File → Import → Charles Session File导入归档即可离线重放所有请求/响应混合模式对核心接口如登录、下单用 Map Local Rewrite 模拟对非核心接口如新闻、公告直接Enable线上代理实现“局部 Mock全局真实”。这种模式让前端可以在无后端介入情况下完成 80% 的 UI 和交互验证。测试同学拿到的不再是“待联调清单”而是“已验证通过的 Charles Session 归档”可直接导入复现问题。6.3 Step 3异常注入——用 Rewrite Breakpoint 模拟“不可能发生的场景”真实世界充满异常但后端很难为你专门构造。Charles 让你成为异常导演异常类型Charles 实现方式业务价值网络异常Rewrite Query String添加_networkslow配合Proxy → Throttle Settings限速 50kbps验证 Loading 状态、超时提示、重试机制数据异常Response Breakpoint修改 JSON 中字段为null、、0、[]测试空状态、默认值、边界值渲染状态异常Map Local 返回 401/403/429/500 响应体或 Rewrite Header 添加X-RateLimit-Remaining: 0验证错误提示、权限控制、限流降级竞态异常同时启用两个断点一个Drop关键请求一个Execute次要请求制造时序错乱发现未处理的竞态条件如重复提交我坚持在每个项目上线前用此法进行“异常压力测试”。某次基金定投功能上线前用 Charles 注入 10% 的 500 错误发现前端未做兜底直接白屏。修复后线上错误率下降 92%。6.4 Step 4知识沉淀——将 Charles 配置转化为团队资产工具的价值在于传承。我要求团队将所有 Charles 配置导出为可版本管理的资产charles-config/目录存放map-local-rules.json、rewrite-rules.json、breakpoints.chlsmock-data/目录存放所有 Map Local 用的 JSON 文件按接口分组命名含版本号user-profile-v2.3.jsonREADME.md说明每条规则的用途、触发条件、预期效果、关联 Jira IssueCI 集成在 GitHub Actions 中用charles-proxy-cli加载配置自动化回归测试。这样新人入职第一天git clone后执行npm run mock:start就能获得一套开箱即用的联调环境。知识不再锁在某个人脑中而是沉淀为代码。7. 常见问题与排查技巧实录那些踩过的坑都成了我的经验索引即使熟练掌握 Charles联调过程中仍会遇到各种“意料之外”。我把过去三年记录的 37 个高频问题浓缩为一张速查表并附上独家排查思路。问题现象可能原因排查步骤我的独家技巧Charles 抓不到任何 HTTPS 请求SSL 代理未启用或证书未信任1. 检查Proxy → SSL Proxying Settings是否启用2. 访问chls.pro/ssl确认证书状态3. 查看Proxy → Recording Settings中Include HTTPS requests是否勾选macOS 用户务必检查“钥匙串访问”中证书的“始终信任”设置这是 90% 的根源。Windows 用户需在“Internet 选项 → 内容 → 证书”中确认 Charles 根证书存在。Map Local 生效但响应为空白JSON 文件编码非 UTF-8或含 BOM 头1. 用 VS Code 打开 JSON 文件 → 右下角查看编码2. 若为UTF-8 with BOM点击转换为UTF-83. 用cat -v filename.json检查是否有^字符养成习惯所有 Mock JSON 文件用 VS Code 新建保存时明确选择UTF-8绝不从网页复制粘贴。我有个预设模板{code:200,data:[],message:success}每次新建都从此开始。Rewrite 规则不生效正则表达式未匹配或作用域选错1. 在 Charles 中右键请求 →Copy → cURL Command粘贴到终端执行确认原始请求内容2. 在Rewrite Settings中勾选Show matching requests in structure观察哪些请求被规则命中3. 确认作用域是Body而非Query String开发 Rewrite 规则时先用curl或 Postman 发送一个最简请求确保能被 Charles 捕获再在此基础上写正则。切忌直接在复杂页面上调试。断点后页面卡死断点未Execute或Drop请求挂起1. 查看 Charles 底部状态栏是否有Breakpoint active提示2. 在Structure面板中查找状态为Breakpoint的请求3. 右键 →Execute放行或Drop丢弃养成“断点即责任”意识每次设置断点必须明确告诉自己“这个断点我要怎么处理”。我习惯在设置断点后立即在便签纸上写下处理计划如“执行检查 response header”。修改 Header 后 403 ForbiddenOrigin或Referer头与后端白名单不匹配1. 查看Request Headers中Origin和Referer值2. 对比后端 CORS 配置如allowedOrigins: [https://m.bank.com]3. 用 Rewrite 修改Origin为匹配值金融类项目务必提前向后端索要CORS 白名单写入团队 Wiki。不要猜测直接问“我们的开发域名http://localhost:3000是否在白名单中”WebSocket 连接失败Charles 默认不代理 WebSocket需手动启用1.Proxy → SSL Proxying Settings→ 勾选Enable SSL Proxying2. 在SSL Proxying Locations中添加 WebSocket 域名如wss://ws.finance.com3. 重启 CharlesWebSocket 是 HTTPS 的子协议必须在 SSL Proxying 中显式添加。很多同学只加了https://api.xxx.com忘了wss://ws.xxx.com导致行情推送失败。最后分享一个小技巧当遇到无法解释的问题时不要陷入 Charles 配置的迷宫。先做一次“最小化验证”关闭所有 Map Local、Rewrite、Breakpoint仅开启 SSL Proxying访问一个最简单的接口如https://httpbin.org/get确认基础代理通畅。再逐个启用功能用排除法定位问题。这招帮我节省了无数无效调试时间。我在实际项目中发现最高效的联调从来不是“等后端接口好了再开始”而是“在需求评审阶段就和后端一起定义好 OpenAPI然后前端用 Charles 搭建好 Mock 环境边开发边验证”。当第一版 UI 代码提交时联调已完成 70%。这种前置协同把联调从“项目后期救
返回列表