一、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 不存在

500、502、503、504 的区别

状态码 问题位置 示例
500 应用程序内部错误 后端代码异常
502 网关收到上游异常响应 后端挂了或响应异常
503 服务暂时不可用 维护、过载、服务器未就绪
503 网关等待上游超时 后端处理太慢

九、接口设计时怎么选状态码?

查询成功

http
GET /api/users/123

用户存在:

http
200 OK

用户不存在:

http
404 Not Found

创建成功

http
POST /api/users

创建成功:

http
201 Created

用户名重复:

http
409 Conflict

参数格式错误:

http
400 Bad Request

业务校验失败:

http
422 Unprocessable Entity

更新成功

http
PUT /api/users/123

更新成功并返回数据:

http
200 OK

更新成功但不返回内容:

http
204 No Content

用户不存在:

http
404  Not Found

删除成功

http
DELETE /api/users/123

删除成功:

http
204 No Content

资源不存在:

http
404 Not Found

登录认证

未带 token:

http
401 Unauthorized

token 过期:

http
401 Unauthorized

权限不足:

http
403 Forbidden

前后端开发中的处理建议

前端处理

前端通常这样处理:

状态码 前端动作
200/201 正常展示数据
204 提示
400/422 展示表单错误
403 展示无权限页面
404 展示不存在页面
429 提示操作过于频繁
500+ 提示服务器异常

后端处理

后端应尽量做到:

建议 说明
状态码准确 不要所有错误都返回 200
错误信息清晰 告诉客户端哪里错了
不暴露敏感信息 不要把数据库错误直接返回
日志完整 方便排查 500、502、504
统一错误格式 前端更容易处理
推荐错误响应格式:
json
{
  "code": "USER_NOT_FOUND",
  "message": "用户不存在",
  "details": {
    "userId": 123
  }
}

十一、常见误区

误区一:所有接口都返回 200

不推荐这样:

http
200 OK
json
{
  "success": false,
  "message": "用户不存在"
}

更推荐:

http
404 Not Found
json
{
  "code": "USER_NOT_FOUND",
  "message": "用户不存在"
}

原因是 HTTP 状态码本身就应该表达请求结果。


误区二:401 和 403 混用

正确区分:

text
没登录 / token 无效 -> 401
登录了但权限不够 -> 403

误区三:参数错误都用 500

参数错误是客户端问题,通常应该返回:

http
400 Bad Request

或者:

http
422 Unprocessable Entity

而不是:

text
500 Internal Server Error

误区四:后端异常信息直接返回前端

不推荐:

json
{
  "message": "SQLSyntaxErrorException: Table user_info not found"
}

推荐:

json
{
  "code": "INTERNAL_ERROR",
  "message": "服务器内部错误"
}

详细异常应记录到后端日志,而不是暴露给用户。


十二、速查表

状态码 名称 简单解释
100 Continue 继续发送请求
101 Switching Protocols 协议切换
200 OK 成功
201 Created 创建成功
202 Accepted 已接受,异步处理中
204 No Content 成功但无内容
301 Moved Permanently 永久重定向
302 Found 临时重定向
304 Not Modified 使用缓存
400 Bad Request 请求有误
401 Unauthorized 未认证
403 Forbidden 无权限
404 Not Found 不存在
405 Method Not Allowed 方法不允许
409 Conflict 资源冲突
422 Unprocessable Entity 业务校验失败
429 Too Many Requests 请求过多
500 Internal Server Error 服务器内部错误
502 Bad Gateway 网关错误
503 Service Unavailable 服务不可用
504 Gateway Timeout 网关超时

核心判断逻辑:

latex
请求成功了吗?
  是 -> 2xx
  否 -> 看是否需要跳转
        是 -> 3xx
        否 -> 是客户端问题?
              是 -> 4xx
              否 -> 5xx