
API 以可预测的方式失败
当 API 调用失败时,大多数开发者会立即打开网络标签或添加 console.log 语句。这虽然有效,但有一种更快的思维模型:每个 API 失败都属于五类之一,而 HTTP 状态码会告诉你属于哪一类。一旦知道类别,修复方法通常就很明显了。

第一步:读取状态码
状态码是最重要的诊断信号。切勿跳过。
4xx — 你发送的内容有误
| 状态码 | 含义 | 最常见原因 |
|---|---|---|
| 400 | 错误请求 | JSON 格式错误、字段类型错误、缺少必填字段 |
| 401 | 未授权 | 令牌缺失或过期、认证方案错误 |
| 403 | 禁止访问 | 令牌有效但权限不足 |
| 404 | 未找到 | URL 路径错误、资源不存在、ID 错误 |
| 405 | 方法不允许 | 应使用 GET 却用了 POST,或反之 |
| 409 | 冲突 | 重复记录、过期更新、竞态条件 |
| 413 | 负载过大 | 文件太大、请求体超过服务器限制 |
| 422 | 无法处理的实体 | JSON 结构正确但字段值无效 |
| 429 | 请求过多 | 被限流——请等待后重试 |
5xx — 服务器出错了
| 状态码 | 含义 | 操作 |
|---|---|---|
| 500 | 服务器内部错误 | 对方有 bug;查看其状态页面 |
| 502 | 网关错误 | 服务器宕机或重启中 |
| 503 | 服务不可用 | 过载或维护中 |
| 504 | 网关超时 | 服务器响应过慢;退避重试 |
5xx 几乎从来不是你的错。在调试自己的代码之前,先检查服务状态页面。
第二步:检查 URL
比开发者预期的更多的 API bug 可追溯到格式错误的 URL。请系统地检查以下内容:
协议 — http 与 https。许多 API 拒绝纯 HTTP 连接或静默重定向。
主机 — 一个拼写错误就会让你连接到错误的服务器或根本连不上。
路径 — 注意缺少前导斜杠、双斜杠或错误的版本前缀(v1 vs v2)。
查询参数 — 值必须进行 URL 编码。空格必须变成 %20;值中的 & 必须变成 %26。在 JavaScript 中动态构建 URL 时,始终使用 encodeURIComponent()。
// 错误——如果 name 包含 &、= 或空格则会出错
const url = `https://api.example.com/search?name=${name}`;
// 正确
const url = `https://api.example.com/search?name=${encodeURIComponent(name)}`;

第三步:检查认证
401 和 403 的区别很重要:
- 401 — 服务器不知道你是谁。凭据缺失、过期或格式错误。
- 403 — 服务器知道你是谁,但不允许该操作。这是权限问题。
对于 JWT Bearer 令牌,解码令牌并检查 exp 声明(过期时间,Unix 时间戳)、aud 声明(目标受众)以及任何 scope 或 permissions 声明。你不需要签名密钥即可读取声明——只有验证签名时才需要。
对于 API 密钥,请确认密钥位于正确的请求头中,并确认你正在为正确的环境使用密钥。生产环境的密钥通常无法在测试端点使用。
对于 Basic Auth,请求头值是 base64(username:password)。解码它以确认凭据正确。
第四步:验证请求体
400 和 422 错误通常意味着请求体有问题。仔细阅读错误响应——它通常会指明哪个字段失败。
常见的请求体问题:
错误的 Content-Type — 发送 JSON 时如果没有 Content-Type: application/json 请求头,某些服务器会完全忽略请求体。
尾随逗号 — 在 JavaScript 中有效,但在 JSON 中无效。值 {"key": "value",} 会导致大多数服务器 JSON 解析失败。
类型错误 — 发送字符串 "123" 而需要整数 123,或发送 "true" 而需要布尔值 true。
null 与缺失 — 某些 API 将显式的 null 与省略的字段区别对待。

第五步:诊断 CORS 错误
CORS 错误仅发生在浏览器中。相同的请求可能从 curl 或 Postman 成功,但在你的 Web 应用中失败,因为浏览器强制执行同源策略,并要求服务器明确允许跨域请求。
CORS 问题的迹象:浏览器控制台显示“Access to fetch has been blocked by CORS policy”,网络标签显示状态码为 0,并且该请求从 Postman 可以正常工作。
修复必须在服务器端进行。无法从浏览器禁用 CORS。检查服务器是否将 Access-Control-Allow-Origin 设置为你的源或 *,以及它是否处理需要 Authorization 请求头的路由的预检 OPTIONS 请求。
第六步:使用 curl 隔离问题
使用 curl 消除所有客户端变量。如果请求在 curl 中有效但在你的代码中无效,则 bug 在你的代码中。如果在 curl 中有效但在浏览器中无效,则是 CORS 问题。
# 带认证头的 GET 请求
curl -v -H "Authorization: Bearer your_token" https://api.example.com/users
# 带 JSON 请求体的 POST 请求
curl -v -X POST \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your_token" \
-d '{"name":"test","email":"test@example.com"}' \
https://api.example.com/users
-v 标志显示完整的请求和响应头。调试时始终包含它——大多数 bug 隐藏在请求头中。
调试工具集
| 问题 | 工具 |
|---|---|
| 解析并分解 URL | URL 解析器 |
| 解码并检查 JWT | JWT 解析器 |
| 解码 Base64 认证头 | Base64 解码器 |
| 查找 HTTP 状态码 | HTTP 状态码 |
| 测试正则表达式匹配响应数据 | 正则测试器 |
→ 从 URL 解析器 开始,分解任何端点 URL,立即捕获编码或路径错误。