HTTP 状态码
状态码(Status Code)是响应行里那个 3 位数字,告诉客户端"这次请求结果如何"。看懂状态码是调试任何接口的基础——日志、监控、告警全是基于它。
1. 状态码的格式
状态行(response 的第 1 行)格式:HTTP版本 + 状态码 + 原因短语。例如:
HTTP/1.1 200 OKHTTP/1.1 404 Not Found
客户端只看数字,原因短语(OK、Not Found)只是给人看的——你完全可以自定义(如 418 I'm a Teapot),只要数字对就行。
2. 五大类:第一位决定含义
状态码第一位数字决定大类:
- 1xx:信息(请求已收到,继续处理)
- 2xx:成功
- 3xx:重定向
- 4xx:客户端错误(你的问题)
- 5xx:服务器错误(服务器的问题)
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。
- 200 OK:万金油,请求成功就返回它。
- 201 Created:POST 创建资源成功后规范做法,并在
Location头给出新资源 URL。 - 204 No Content:成功但没有 body——DELETE、PUT 经常用。前端要注意:
fetch取res.json()会报错,应改用res.ok判断。 - 206 Partial Content:断点续传、视频拖动进度条时用,配合
Content-Range头。
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 头,告诉客户端"下一步去哪里"。
- 301 vs 302:301 永久(SEO 权重转移、http→https 跳转),302 临时(如未登录跳登录页)。浏览器/搜索引擎对 301 会缓存。
- 307 vs 308:HTTP/1.1 引入的"严格版"——重定向后保持原方法和 body。302/301 在历史上行为不一(有些浏览器把 POST 改成 GET),新代码用 307/308 更可靠。
- 304 Not Modified:缓存命中。客户端在请求里带
If-Modified-Since或If-None-Match,服务器检查没变就回 304,不带 body,让浏览器用本地副本。
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 # 限流,请求太频繁这一类客户端自己改请求就能解决。重点区分几个高频的:
- 400 vs 422:400 语法格式错(JSON 解析失败、缺字段);422 语法对但业务校验失败(邮箱格式不对、密码强度不够)。
- 401 vs 403:401 = 没登录(不知道你是谁);403 = 登录了但没权限(你是普通用户访问管理员面板)。401 响应头会带
WWW-Authenticate。 - 404 vs 410:410 是"永久消失",比 404 更明确——告诉爬虫"别再来"。
- 429 Too Many Requests:限流。响应头常带
Retry-After: 60告诉你 60 秒后再试。
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 或基础设施故障:
- 500:服务器代码异常(空指针、SQL 报错)。看后端日志。
- 502 vs 504:都是网关/代理报的(Nginx、CDN)。
- 502 = 上游返回了无效响应(上游崩了、连接被重置)。
- 504 = 上游超时没回响应(接口太慢,超过 Nginx 的 timeout)。
- 503:服务不可用——维护中、重启中、过载。常配合
Retry-After头。
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/
# 20010. 自定义状态码?不要!
有些团队图省事,发明 200 + body 里形如 code:500 的"自定义业务码"。这种做法虽然广泛存在,但违反 HTTP 语义——CDN、监控、APM、SDK 全都靠标准状态码工作。新项目请直接用 4xx/5xx 表达业务错误,body 里只放人类可读的错误详情。
11. 排错速查表
- 404:URL 拼错?后端路由没注册?
- 405:方法不对(GET 调成了 POST?)
- 400:参数格式错?JSON 拼错?
- 401:Token 没传/过期?
- 403:权限不够?后端白名单没配?
- 415:
Content-Type没设对? - 500:后端代码挂了,看日志栈。
- 502/504:上游服务挂了/超时,运维层面。
- CORS 失败:通常是 OPTIONS 预检没过,看响应头
Access-Control-Allow-Origin。
小结
状态码第一位决定大类:1 信息、2 成功、3 重定向、4 客户端错、5 服务器错。最常用的 10 个:200 201 204 301 302 304 400 401 403 404 500 502 503 504。背下来 + 知道每个的排错方向就够了。
← 上一篇 HTTP 请求方法
下一篇 HTTP 头部 →