Charles录制时Post请求的响应数据怎么没显示?

Top丶利云 阅读 35

用Charles抓包调试接口时发现,发送的Post请求在Recording里能看到请求头和参数,但响应数据栏一直是空的。

我用fetch发送的POST请求是这样的:


fetch('/api/update', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ userId: 123, status: 'active' })
})
.then(response => response.json())
.catch(error => console.error('Error:', error));

已经确认手机和电脑在同一个WiFi下,Charles的SSL证书也装了,其他GET请求都能正常看到响应。但只有这个POST请求的响应内容显示为空白,状态码倒是显示200。尝试过清除缓存、重启Charles都没用,是不是哪里配置漏了?

我来解答 赞 3 收藏
二维码
手机扫码查看
1 条解答
光浩 ☘︎
这个问题大概率是HTTPS加密导致的,虽然你提到装了SSL证书,但还是得仔细检查下配置。首先确认下这个POST请求是不是走的HTTPS协议,因为HTTP和HTTPS在Charles里表现会不一样。

你要做这么几件事:打开Charles,进入菜单栏Proxy下的SSL Proxying Settings,确保添加了对应的域名规则,格式一般是*.yourdomain.com。别忘了在客户端设备上重新安装并信任Charles的根证书,有时候证书更新了但设备没同步。

另外要注意,有些接口可能会对请求头做校验,特别是涉及安全相关的接口。建议你在Charles里右键这个请求,选择"Edit Session",看看响应内容是不是被压缩或者加密了。如果响应头里有Content-Encoding: gzip,记得解压后再看。

还有一点容易被忽略,现代浏览器和客户端会对跨域请求做预检,也就是OPTIONS请求。虽然你看到的是POST请求,但实际上可能先发了个OPTIONS,这个也会影响最终的响应展示。

代码这块倒是没啥大问题,不过建议你在fetch调用里加个debugger,打印下完整的response对象:
fetch('/api/update', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ userId: 123, status: 'active' })
})
.then(response => {
console.log(response); // 打印完整响应
return response.json();
})
.catch(error => console.error('Error:', error));


最后提醒一句,调试完记得把Charles的代理关掉,尤其是涉及敏感数据的时候,开着代理容易有安全隐患。我之前就遇到过同事忘记关代理,结果测试环境的数据全被人看到了,挺尴尬的。
点赞 3
2026-02-15 22:51