一、HTTP 状态码是什么?

HTTP 状态码是服务器对客户端请求的结果说明。
例如浏览器、App、前端页面或接口调用发送请求:

http
GET /api/users/123 HTTP/1.1

服务器会返回:

http
HTTP/1.1 200 OK

其中 200 就是状态码,表示请求成功。
状态码不是业务数据本身,而是对这次HTTP请求结果的概括。

二、状态码分类

范围 类型 含义
1xx 信息响应 请求已收到,继续处理
2xx 成功 请求已成功处理
3xx 重定向 需要客户端进一步操作
4xx 客户端错误 请求本身有问题
5xx 服务端错误 服务器处理时出错
实际开发中最常见的是2xx3xx4xx5xx

三、1xx:信息响应

100 Continue

表示服务器已经收到请求头,客户端可以继续发送请求体。
常见于大文件上传前的确认机制。
例如客户端想上传一个很大的文件,先问服务器:

http
Expect: 100-continue

如果服务器返回:

http
100 Continue

客户端再继续上传文件内容。

101 Switching Protocols

表示服务器同意切换协议。
常见场景是 WebSocket。
客户端请求从HTTP协议升级为 WebSocket:

http
Upgrade: websocket

服务器返回:

http
101 Switching Protocols

表示协议切换成功。

四、2xx:成功状态码

200 OK

最常见的成功状态码。
表示请求成功,服务器返回了正常的结果。
常见场景:

http
GET /api/users

返回:

http
"users": []

适用于:

请求方法 场景
GET 查询成功
POST 操作成功并返回结果
PUT 更新成功并返回结果
DELETE 删除成功并返回结果

201 Created

表示资源创建成功。
常见于新增数据:

http
POST /api/users

请求体:

http
{
  "name": "TOM"
}

返回:

http
201 Created

通常表示服务器已经创建了一个新用户。
有时响应头会带上新资源地址:

http
Loocation: /api/users/123

202 Accepted

表示请求已被接受,但还没有处理完成。
适合异步任务。
例如:

http
POST /api/video/export

服务器返回:

http
202 Accepted

意思是导出任务已经提交,但视频还没有生成完。

204 No Content

表示请求成功,但响应体为空。
常见于删除成功:

http
DELETE /api/users/123

返回:

http
204 No Content

含义是删除成功,但服务器不返回额外内容。

五、3xx:重定向状态码

3xx 表示客户端需要访问另一个地址。

301 Moved Permanently

永久重定向。
表示资源地址永久改变。
例如:

http
http://example.com

永久跳转到:

http
https://example.com

搜索引擎会把旧地址权重转移到新地址。

302 Found

临时重定向。
表示这次请求临时跳转到另一个地址,但是原地址以后还可能继续使用。
常见于登录跳转:

http
GET /profile

如果未登录,服务器返回:

http
302 Found
Locatio: /login

浏览器会跳转到登录页。

304 Not Modified

表示资源没有变化,客户端可以使用缓存。
例如浏览器之前请求过一个图片或 JS 文件,再次请求时带上缓存标识:

http
If-None-Match: "abc123"

服务器判断文件没变,就返回:

http
304 Not Modified

这样浏览器就不用重新下载资源。

六、4xx:客户端错误

4xx 表示请求方向有问题,通常是参数、权限、路径、格式等错误。

400 Bad Request

请求格式错误或参数错误。
常见原因:

原因 示例
JSON 格式错误 少了引号或括号
参数类型错误 id 应该是数字却传了字符串
必填参数缺失 没传username
请求格式不符合要求 Conten-Type 不正确

例如:

json
{
  "age": "abc"
}

如果 age 应该是数字,就可能返回:

http
400 Bad Request

401 Unauthorized

表示未认证
注意:401 不是 “没有权限”,而是 “还没有证明你是谁”。
常见场景:

场景 说明
未登录 没有 token
token 过期 登录状态失效
token 无效 token 被篡改或格式错误
例如请求需要登录的接口:
http
GET /api/me
Authorization:Bearer invalid-token

返回:

http
401 Unauthorized

403 Forbidden

表示已认证,但没有权限。
也就是说,服务器知道你是谁,但你不能访问这个资源。
例如普通用户访问管理员接口:

http
GET /api/admin/users

返回:

http
403 Forbidden

401 和 403 的区别:

状态码 含义
401 你还没有登录,或者认真失败
403 你已登录但权限不够

404 Not Found

表示资源不存在。
常见原因:

原因 表示
URL 写错 /api/users 拼错
资源 ID 不存在 /api/users/999999
文件不存在 图片、页面找不到
例如:
http
GET /api/users/999

如果用户不存在,可以返回:

http
404 Not Found

405 Method Not Allowed

表示请求方法不允许。
例如接口只支持 GET:

http
GET /api/users

但你发送了:

http
POST /api/users

服务器可能返回:

http
405 Method Not Allowed

409 Conflict

表示请求与当前资源状态冲突。
常见场景:

场景 示例
重复创建 用户名已存在
数据版本冲突 多人同时编辑同一条数据
状态不允许 订单已取消,不能再支付
例如注册用户时用户名重复:
json
{
  "username": "tom"
}

如果 tom 已存在,可以返回:

http
409 Conflict

422 Unprocessable Entity

表示请求格式正确,但语义校验失败。
它和 400 比较接近,但更偏向 “业务校验失败”。
例如:

json
{
  "email": "not-an-email",
  "password": "123"
}

JSON 格式没问题,但邮箱格式不合法、密码太短,就可以返回:

http
422 Unprocessable Entity

常用于表单校验。


429 Too Many Requests

表示请求太频繁,被限流。
常见场景:

场景 说明
短时间频繁登录 防止暴力破解
高频调用接口 API 限流
爬虫请求太快 防止服务器压力过大
服务器可能返回:
http
429 Too Many Requests
Retry-After: 60

表示 60 秒后再试。


七、5xx:服务端错误

5xx 表示请求本身可能没问题,但服务处理失败。

500 Internal Server Error

服务器内部错误。
常见原因:

原因 示例
代码异常 空指针、数组越界
数据库异常 SQL执行失败
配置错误 环境变量缺失
未捕获异常 程序崩溃
例如后端代码抛异常:
latex
TypeError: Cannot read property 'id' of undefined

就可能返回:

http
500 Inernal Server Error

502 Bad Gateway

网关错误。
通常发生在代理服务器、网关负载均衡器和上游服务之间。
例如:

latex
浏览器 -> Nginx -> 后端服务

如果 Nginx 能收到请求,但后端服务返回了无效响应,可能返回:

http
502 Bad Gateway

常见原因:

原因 说明
后端服务挂了 网关连不上
上游返回异常 返回格式不符合预期
服务端口错误 Nginx 转发到错误端口
服务重启中 短暂不可用

503 Service Unavailable

服务不可用。
常见场景:

场景 说明
服务维护中 临时停机
服务过载 请求太多
依赖服务不可用 数据库、缓存异常
容器未就绪 服务还没启动完成
例如服务器正在维护:
http
503 Service Unavailable

有时会带:

http
Retry-After: 300

表示 300 秒后再试。


504 Gateway Timeout

网关超时。
还是以 Nginx 为例:

latex
浏览器 -> Nginx -> 后端服务

如果 Nginx 等后端响应等太久,超时后就返回:

http
504 Gateway Timeout

常见原因:

原因 示例
后端接口太慢 查询大量数据
数据库响应慢 慢 SQL
第三方接口超时 支付、短信、地图服务
网络异常 网关到上游服务连接慢

八、常见状态码对比

400、401、403、404的区别

状态码 问题类型 示例
400 请求参数有问题 参数缺失、格式错误
401 未登录或认证失败 token过期
403 已登录但无权限 普通用户访问管理员接口
404 资源不存在 用户 ID 不存在