后端 · 调试

API 调试实战:从 curl 到上线的 8 个排障手段

后端返回 500?前端拿不到数据?JWT 过期了不知道?这篇不是 API 入门,是给已经写过接口的人的排障清单——从拿到错误到定位问题,一条线串完。

第一步:搞清楚 HTTP 状态码在说什么

API 调试的第一关永远不是"代码哪里写错了",而是"这个响应到底算成功还是失败"。很多人看到 200 就放心了,看到 500 就慌了——但实际上:

排障的第一步:看状态码,别急着翻代码。

💡

很多 API 的错误信息藏在 JSON Body 里。状态码只能告诉你"哪一类问题",messageerror 字段才是真正的线索。

第二步:JSON 格式化和校验

拿到响应的第一件事不是人眼硬读——是格式化。一段压缩的 JSON 没有任何可读性,漏个逗号你根本看不出来。

常见问题:

JSON 格式化工具 一键格式化和校验,比手动找半天的逗号快得多。

第三步:JWT 验签和解析

如果你的 API 用 JWT 做认证,排障时最常见的问题是"这个 Token 还有效吗?"和"里面到底存了什么?"

JWT 的三段结构(Header.Payload.Signature)用 Base64Url 编码,直接人眼看不出来的。常见坑:

把 Token 粘到 JWT 解码器 里,Header、Payload、过期时间一目了然。比每次都 atobJSON.parse 快十倍。

第四步:URL 编码坑

GET 请求的 query 参数里出现中文、空格、&,你的接口就炸了。这不是"编码问题",是你没做 URL 编码。

最典型的场景:

URL 编码工具 快速验证编码前后的差异,比翻文档快。

第五步:时间戳对齐

前后端对接最常见的"玄学 bug"之一:明明数据库里有这条记录,API 返回"找不到"。查半天发现——时间戳单位不对。

前端用 1700000000000(毫秒),后端期望 1700000000(秒),差了 1000 倍——要么查不到,要么查到 1970 年的数据。

时间戳转换器 验证你手上的时间戳到底是秒还是毫秒,一键转成人类可读时间。

⚠️

JWT 的 expiatnbf 字段用的是秒级时间戳(NumericDate)。如果你把 JavaScript 的 Date.now()(毫秒)直接塞进去,Token 会"看起来"过期时间在 53000 年以后。

第六步:Base64 编解码

API 调试中 Base64 出现的频率远比你想象的高:

最常踩的坑:标准 Base64 和 URL-safe Base64 不一样。+-/_= 可以省略。JWT 用的是 URL-safe 变体,如果你用标准 Base64 解码器去解 JWT,遇到 -_ 就会报错。

Base64 工具 支持标准和 URL-safe 两种模式,排查编码问题时不用再猜了。

第七步:哈希校验——数据一致性检查

API 返回的数据和数据库里的不一致?文件下载后内容损坏?这些都是哈希的用武之地。

调试时你经常需要确认"这段文本的 SHA-256 是不是和文档里写的一样"。哈希生成器 一键出结果,比装命令行工具快。

第八步:用 curl 重现,用工具验证

所有浏览器 Network 面板里都能 "Copy as cURL"。拿到 curl 命令后:

  1. 先原样跑一次,确认复现
  2. curl 转代码 转成 fetch/axios/Python/Go,对比你的代码
  3. 逐个去掉 Header,找出哪个 Header 是必须的
  4. 改 Body 参数,确认服务端校验逻辑

很多人跳过"原样跑一次"这一步,直接改参数,结果改了三个地方,也不知道到底是哪个改法解决了问题。

排障的核心原则:一次只改一个变量。 curl 可以精确重现,这是浏览器 Network 面板做不到的——因为浏览器的请求带了太多隐式 Header 和 Cookie。

排障流程总结

把上面的步骤串成一条线:

  1. 看状态码 → 定位问题大类
  2. 格式化 JSON → 找到具体错误信息
  3. 解析 JWT → 确认认证状态和 Claims
  4. 检查 URL 编码 → 排除参数传递问题
  5. 对齐时间戳 → 排除时间单位不匹配
  6. 解码 Base64 → 确认编码数据是否正确
  7. 计算哈希 → 确认数据一致性
  8. curl 重现 → 最小化复现条件

8 步走完,95% 的 API 问题能定位到原因。剩下 5% 通常是服务端代码逻辑 bug,那该去翻日志了。

💡

上面提到的所有工具(JSON 格式化、JWT 解码、URL 编码、时间戳转换、Base64、哈希、cURL 转换)都在 DevUtils 上可以免费使用,全部浏览器本地运行,数据不上传。