HTTP 状态码

状态码(Status Code)是响应行里那个 3 位数字,告诉客户端"这次请求结果如何"。看懂状态码是调试任何接口的基础——日志、监控、告警全是基于它。

1. 状态码的格式

状态行(response 的第 1 行)格式:HTTP版本 + 状态码 + 原因短语。例如:

客户端只看数字,原因短语(OKNot Found)只是给人看的——你完全可以自定义(如 418 I'm a Teapot),只要数字对就行。

2. 五大类:第一位决定含义

状态码第一位数字决定大类:

3. 1xx 信息(少见)

# 1xx 信息 (比较少见)
HTTP/1.1 100 Continue              # "你 body 接着发吧" (大文件预检后)
HTTP/1.1 101 Switching Protocols   # WebSocket 升级协议时返回

日常开发基本遇不到,唯一会撞上的是 WebSocket 升级时的 101。

4. 2xx 成功

# 2xx 成功
HTTP/1.1 200 OK                    # 最常见,请求成功,响应体有数据
HTTP/1.1 201 Created               # 资源创建成功 (POST 新建后常用)
HTTP/1.1 202 Accepted              # 已受理,但还没处理完 (异步任务)
HTTP/1.1 204 No Content            # 成功但无响应体 (DELETE 后常用)
HTTP/1.1 206 Partial Content       # 部分内容 (断点续传/视频拖动)

实战频率:200 > 201 > 204 > 206 > 202

5. 3xx 重定向

# 3xx 重定向 — 看 Location 头决定跳哪里
HTTP/1.1 301 Moved Permanently     # 永久重定向,SEO 权重转移
Location: https://www.example.com/new

HTTP/1.1 302 Found                 # 临时重定向 (老规范,实际广泛使用)
Location: /login

HTTP/1.1 304 Not Modified          # 缓存命中,继续用浏览器本地的副本
# (没有 body,服务器告诉你"你那份还新鲜,不用重新下")

HTTP/1.1 307 Temporary Redirect    # 临时,且方法和 body 保持不变 (比 302 严格)
HTTP/1.1 308 Permanent Redirect    # 永久,且方法和 body 保持不变 (比 301 严格)

重定向响应一定带 Location 头,告诉客户端"下一步去哪里"。

6. 4xx 客户端错误

# 4xx 客户端出错 — 请求本身有问题
HTTP/1.1 400 Bad Request           # 报文格式/参数错误
HTTP/1.1 401 Unauthorized          # 没登录 / 凭证无效 (实际是 "未认证")
HTTP/1.1 403 Forbidden             # 登录了但没权限 (例如访问别人家相册)
HTTP/1.1 404 Not Found             # URL 对应的资源不存在
HTTP/1.1 405 Method Not Allowed    # /users 不允许 PUT (只允许 GET/POST)
HTTP/1.1 409 Conflict              # 冲突 (用户名已存在)
HTTP/1.1 410 Gone                  # 资源永久消失 (比 404 更明确)
HTTP/1.1 413 Payload Too Large     # 上传文件太大
HTTP/1.1 415 Unsupported Media Type# Content-Type 服务器不认
HTTP/1.1 429 Too Many Requests     # 限流,请求太频繁

这一类客户端自己改请求就能解决。重点区分几个高频的:

7. 5xx 服务器错误

# 5xx 服务器出错 — 请求没问题,服务器处理时挂了
HTTP/1.1 500 Internal Server Error # 服务器代码崩了 (空指针/异常)
HTTP/1.1 501 Not Implemented       # 服务器不支持这个方法
HTTP/1.1 502 Bad Gateway           # 网关收不到上游响应 (上游崩了)
HTTP/1.1 503 Service Unavailable   # 服务不可用 (维护中/超载)
HTTP/1.1 504 Gateway Timeout       # 网关等上游超时

这一类不是用户的问题——通常是代码 bug 或基础设施故障:

8. 418 I'm a Teapot — 一个玩笑

418 来自 1998 年愚人节 RFC:"我是一个茶壶,不能煮咖啡"。它不是正式状态码,但 httpbin 等测试服务经常实现,开发者圈子里被玩成梗。生产环境不要用

9. curl 看状态码

# curl -i 把状态行打印出来
curl -i https://httpbin.org/status/418
# HTTP/1.1 418 I'm a Teapot
# ...

# -w 也可以直接取状态码
curl -o /dev/null -s -w '%{http_code}\n' https://example.com/
# 200

10. 自定义状态码?不要!

有些团队图省事,发明 200 + body 里形如 code:500 的"自定义业务码"。这种做法虽然广泛存在,但违反 HTTP 语义——CDN、监控、APM、SDK 全都靠标准状态码工作。新项目请直接用 4xx/5xx 表达业务错误,body 里只放人类可读的错误详情。

11. 排错速查表

小结

状态码第一位决定大类:1 信息、2 成功、3 重定向、4 客户端错、5 服务器错。最常用的 10 个:200 201 204 301 302 304 400 401 403 404 500 502 503 504。背下来 + 知道每个的排错方向就够了。

← 上一篇 HTTP 请求方法

下一篇 HTTP 头部

✈️💬