API 调试实战:从 curl 到上线的 8 个排障手段
后端返回 500?前端拿不到数据?JWT 过期了不知道?这篇不是 API 入门,是给已经写过接口的人的排障清单——从拿到错误到定位问题,一条线串完。
第一步:搞清楚 HTTP 状态码在说什么
API 调试的第一关永远不是"代码哪里写错了",而是"这个响应到底算成功还是失败"。很多人看到 200 就放心了,看到 500 就慌了——但实际上:
400不是"服务端出错了",是"你的请求有问题",先查参数和 Body401和403不是一回事:401 是"你谁",403 是"你不行"422是"格式对了但业务校验没过",比 400 更具体429是限流,不是你的代码有 bug,是你请求太频繁了
排障的第一步:看状态码,别急着翻代码。
很多 API 的错误信息藏在 JSON Body 里。状态码只能告诉你"哪一类问题",message 或 error 字段才是真正的线索。
第二步:JSON 格式化和校验
拿到响应的第一件事不是人眼硬读——是格式化。一段压缩的 JSON 没有任何可读性,漏个逗号你根本看不出来。
常见问题:
- 最后多了一个逗号(trailing comma)——JSON 规范不允许,但 JS 对象可以
- 键名用了单引号——JSON 只认双引号
- 混进了注释——JSON 没有注释语法,
//和/* */都不行 - 值里出现了
NaN、Infinity——JSON 不支持这些值
用 JSON 格式化工具 一键格式化和校验,比手动找半天的逗号快得多。
第三步:JWT 验签和解析
如果你的 API 用 JWT 做认证,排障时最常见的问题是"这个 Token 还有效吗?"和"里面到底存了什么?"
JWT 的三段结构(Header.Payload.Signature)用 Base64Url 编码,直接人眼看不出来的。常见坑:
exp已过——注意时间戳是秒级还是毫秒级,搞错了会"看起来过期了但其实没有"iss和aud不匹配——签发方和受众对不上,服务端会拒- Signature 验签不过——密钥换了但旧 Token 还在流转
把 Token 粘到 JWT 解码器 里,Header、Payload、过期时间一目了然。比每次都 atob 再 JSON.parse 快十倍。
第四步:URL 编码坑
GET 请求的 query 参数里出现中文、空格、&,你的接口就炸了。这不是"编码问题",是你没做 URL 编码。
最典型的场景:
- 搜索接口:用户搜
c++,+被解析成空格——你需要先 URL 编码 - 回调地址:
redirect_uri=https://example.com/callback?code=abc——不编码的话?和&会被当成当前 URL 的参数 - Base64 在 URL 里:
+和/和=都是特殊字符——需要 Base64Url 编码
用 URL 编码工具 快速验证编码前后的差异,比翻文档快。
第五步:时间戳对齐
前后端对接最常见的"玄学 bug"之一:明明数据库里有这条记录,API 返回"找不到"。查半天发现——时间戳单位不对。
- JavaScript
Date.now()返回毫秒(13 位) - Python
int(time.time())返回秒(10 位) - Go
time.Now().Unix()返回秒(10 位) - Go
time.Now().UnixMilli()返回毫秒(13 位)
前端用 1700000000000(毫秒),后端期望 1700000000(秒),差了 1000 倍——要么查不到,要么查到 1970 年的数据。
用 时间戳转换器 验证你手上的时间戳到底是秒还是毫秒,一键转成人类可读时间。
JWT 的 exp、iat、nbf 字段用的是秒级时间戳(NumericDate)。如果你把 JavaScript 的 Date.now()(毫秒)直接塞进去,Token 会"看起来"过期时间在 53000 年以后。
第六步:Base64 编解码
API 调试中 Base64 出现的频率远比你想象的高:
- HTTP Basic Auth:
Authorization: Basic base64(username:password) - JWT 的三段都是 Base64Url 编码
- 文件上传:
data:image/png;base64,iVBORw0KGgo... - SAML Token、SMTP Auth、很多 OAuth 流程都在用
最常踩的坑:标准 Base64 和 URL-safe Base64 不一样。+ 变 -,/ 变 _,= 可以省略。JWT 用的是 URL-safe 变体,如果你用标准 Base64 解码器去解 JWT,遇到 - 和 _ 就会报错。
Base64 工具 支持标准和 URL-safe 两种模式,排查编码问题时不用再猜了。
第七步:哈希校验——数据一致性检查
API 返回的数据和数据库里的不一致?文件下载后内容损坏?这些都是哈希的用武之地。
- 校验文件完整性:
MD5够快,SHA-256更安全 - 验证 Webhook 签名:大部分平台用 HMAC-SHA256
- 去重/缓存的 ETag:
ETag: "hash-of-content"
调试时你经常需要确认"这段文本的 SHA-256 是不是和文档里写的一样"。哈希生成器 一键出结果,比装命令行工具快。
第八步:用 curl 重现,用工具验证
所有浏览器 Network 面板里都能 "Copy as cURL"。拿到 curl 命令后:
- 先原样跑一次,确认复现
- 用 curl 转代码 转成 fetch/axios/Python/Go,对比你的代码
- 逐个去掉 Header,找出哪个 Header 是必须的
- 改 Body 参数,确认服务端校验逻辑
很多人跳过"原样跑一次"这一步,直接改参数,结果改了三个地方,也不知道到底是哪个改法解决了问题。
排障的核心原则:一次只改一个变量。 curl 可以精确重现,这是浏览器 Network 面板做不到的——因为浏览器的请求带了太多隐式 Header 和 Cookie。
排障流程总结
把上面的步骤串成一条线:
- 看状态码 → 定位问题大类
- 格式化 JSON → 找到具体错误信息
- 解析 JWT → 确认认证状态和 Claims
- 检查 URL 编码 → 排除参数传递问题
- 对齐时间戳 → 排除时间单位不匹配
- 解码 Base64 → 确认编码数据是否正确
- 计算哈希 → 确认数据一致性
- curl 重现 → 最小化复现条件
8 步走完,95% 的 API 问题能定位到原因。剩下 5% 通常是服务端代码逻辑 bug,那该去翻日志了。
上面提到的所有工具(JSON 格式化、JWT 解码、URL 编码、时间戳转换、Base64、哈希、cURL 转换)都在 DevUtils 上可以免费使用,全部浏览器本地运行,数据不上传。