2. HTTP 状态码基础:2xx、3xx、4xx、5xx 状态码详解

做接口调试,第一件事就是看懂状态码。

它就像服务器的「表情」——200 是笑脸,5xx 就是崩溃大哭。尤其是权限和超时问题,基本都集中在 401、403 和 504 这三个码上。

我个人习惯,先不看响应体,先瞄一眼状态码。很多时候,码对了,问题就解决了一半。

2.1 2xx 成功家族:一切正常

2xx 意味着服务器接收、理解了请求,并且处理了。最常见的是 200,但别忽略其他几个。

状态码 含义 应用场景
200 OK 请求成功。GET、POST 等最常用的响应。 查询数据、提交表单成功。
201 Created 资源创建成功。通常跟在 POST 或 PUT 后面。 新增用户、上传文件后返回。
204 No Content 服务器处理成功,但不需要返回任何内容。 删除资源、更新配置后,只需要确认成功。
经验提示:我在审计接口调试时,常看到新人盯着 204 返回空 body 发愣,以为是接口没调通。这是正常的——204 表示「事情办完了,没东西给你看」。

2.2 3xx 重定向家族:换个地方找我

3xx 表示服务器说「你要的东西不在这,去别处看看」。接口调试里,最常见的坑是 302。

  • 301 Moved Permanently:资源永久迁移了。下次直接用新 URL。
  • 302 Found:临时跳转。我遇到过接口文档写的 URL 是旧的,服务器返回 302 跳到了新地址,但客户端没 follow 重定向,导致报错。
  • 304 Not Modified:资源没变化,直接用本地缓存。这在优化性能时很有用。

嗯,调试时如果看到 3xx,别急着说接口坏了,先检查一下请求 URL 是不是对的。

2.3 4xx 客户端错误家族:我的锅?不,是你的锅

4xx 表示你发的请求有问题。权限问题基本上都藏在这。

401 Unauthorized:你没登录,或者登录过期了

401 的意思是「你是谁?我不认识你」。服务器压根儿不知道你的身份。常见的两种情况:

  • 没带 :请求头里没有 Authorization 字段。
  • 过期:时间戳超了,或者签名不对。

调试方法:先检查请求头里有没有 。有的话,把 拿到 JWT 解码器里看一眼过期时间。

避坑指南:我曾经遇到过客户端发的是 Bearer ,但服务器要求的是 Basic Auth,直接报 401。调了半天才发现是认证方式不匹配,低级错误,但很隐蔽。

403 Forbidden:你有身份,但没权限

403 的意思是「我知道你是谁,但你不配看这个资源」。和 401 的关键区别就是:

  • 401:认证失败(没登录)。
  • 403:认证成功但授权失败(权限不足)。

调试 403 时,我建议先看这几样东西:

  1. 用户角色或权限组有没有对应接口的访问权限。
  2. 资源所属部门(比如只能看自己部门的订单)。
  3. IP 白名单或黑名单限制。
注意:有些接口在权限不足时故意返回 404 而不是 403,这叫「模糊处理」,防止攻击者猜资源是否存在。别被迷惑了。

其他常见 4xx

状态码 含义 常见原因
400 Bad Request 请求语法错误,服务器看不懂。 JSON 格式错误、缺少必填字段。
404 Not Found 资源不存在,或者被隐藏了。 URL 拼错、资源已删除。
429 Too Many Requests 请求太快,被限流了。 短时间大量请求。

2.4 5xx 服务器错误家族:服务器炸了

5xx 表示你的请求没错,但服务器内部出了毛病。超时问题基本都归 504 管。

504 Gateway Timeout:上游响应超时

这个是今天的重点之一。504 出现在网关(Nginx、API Gateway)上。网关把请求转发给后端服务,等了 N 秒没收到回复,索性返回 504。

为什么会这样?

  • 后端服务处理太慢,超过了网关的超时设置(通常是 5s、10s 或 30s)。
  • 后端服务挂了,连接不上。
  • 数据库查询太慢,比如全表扫描、死锁。
  • 第三方 API 调用卡住了。

调试思路:

  1. 先确认是哪个环节超时。看网关日志里的 upstream 响应时间。
  2. 用 curl -w "@time.txt" 或类似工具测试后端接口的直接响应时间。
  3. 如果是数据库慢查询,打开慢查询日志,看看耗时长的 SQL。
  4. 检查网关的超时设置(proxy_read_timeout、proxy_connect_timeout)。
经验分享:我记得有一次排查线上 504,折腾了半天,最后发现是数据库连接池满了,请求在排队。调大了连接池大小,问题立马解决。有时候问题不在代码,在基础设施配置。

其他常见 5xx

状态码 含义 常见原因
500 Internal Server Error 服务端通用错误。 代码抛异常、空指针、配置错误。
502 Bad Gateway 网关收到无效响应。 后端服务崩了,或者响应格式不对。
503 Service Unavailable 服务暂时不可用。 服务器过载、正在维护。

2.5 知识框架:状态码调试地图

下面这张图总结了本章的核心逻辑——从收到响应码开始,如何快速定位问题方向。你想想看,以后碰到任何状态码,都可以对照这张图走一遍流程。

HTTP 状态码调试地图 收到响应码 2xx 成功 万事大吉 3xx 重定向 检查 URL / 缓存 4xx 客户端错误 401 认证失败 403 权限不足 5xx 服务端错误 504 超时(重点) 🔑 调试口诀: 2xx 笑,3xx 跑,4xx 在我,5xx 在它。 401 是没登录,403 是没权限,504 是网关等太久。

2.6 小结:调试时的快速对照表

最后,我整理了一个快速对照表。调试时直接拿来用就好。

状态码 一句话诊断 第一反应
401 认证失败 检查 是否有效、是否过期
403 授权失败(权限不足) 检查用户角色、资源归属、IP 限制
404 资源不存在 检查 URL、资源是否已被删除
429 请求被限流 降低请求频率,检查限流策略
502 网关收到无效应答 检查后端服务是否正常运行
504 网关超时 检查后端响应时间、数据库性能、网关超时配置