介绍
前后端分离 API 响应有两大开发规范,两种规范都是行业正规标准,只是设计思想、适用场景、前后端处理逻辑完全不同。
HTTP 状态码 和 业务状态码
- HTTP 状态码:传输协议层面的状态,由 HTTP 协议定义。
- 业务状态码:接口业务逻辑层面的状态,开发者自定义。
规范一:国内企业主流规范
统一 HTTP 200 + 自定义业务码
设计思想
- HTTP 状态码只管「网络、请求格式、服务器异常」
- 只要后端正常走完逻辑、能返回 JSON 响应,不管业务成功还是失败,HTTP 固定 200
- 业务结果:成功、失败、数据已存在、数据不存在、权限不足等,全部由响应体内自定义 code 控制
固定响应格式
{
"code": 20000, // 自定义业务状态码
"msg": "操作提示文案",
"data": null // 业务数据
}
HTTP 状态码使用规则
仅以下情况不用 200:
- 400:请求参数格式错误、缺字段、类型不匹配
- 401:未登录、Token 过期
- 403:已登录但无操作权限
- 404:接口路由地址不存在
- 500:后端代码报错、数据库异常、服务崩溃
业务场景一律 HTTP=200:
数据已存在、数据不存在、新增失败、用户名重复、表单校验失败、余额不足等。
后端处理
所有业务判断正常返回 JSON,不抛 HTTP 异常码。
前端处理(Axios)
- 所有业务响应全部进入 then
- 拦截器只判断:
res.data.code- 成功:走正常业务逻辑
- 失败:直接弹窗
msg提示
- 只有网络超时、500、404 才进入 catch
优点
- 前端拦截器极简,统一提示、统一封装非常容易
- 所有业务结果都在正常回调,不用混在异常里处理
- 浏览器/调试工具不会标红,开发体验好
- 小程序、App、移动端兼容性无坑
- 团队协作成本低,新人上手快
缺点
- 不完全符合标准 REST 语义化设计
- 对外公开开放 API 时,第三方调用方不够直观
适用场景
- 国内 90% 以上 Vue/React 前后端分离管理系统
- 内部业务系统、后台项目、CRUD 系统
- 团队协作、中小型项目、教学实训项目
- 你当前正在开发的标签管理这类业务系统
规范二:标准 RESTful 规范
HTTP 状态码承载业务语义
设计思想
- 不用自定义业务码
- 直接用原生 HTTP 状态码表达业务结果
- HTTP 状态码同时承担「协议传输 + 业务逻辑」两层含义
常用 HTTP 码与业务对应
- 200:查询成功、普通操作成功
- 201:新增数据成功
- 204:删除成功(无返回体)
- 400:参数错误、业务校验失败
- 401:未登录、认证失败
- 403:权限不足
- 404:资源/数据不存在
- 409:数据冲突、已存在(同名重复)
- 500:服务器内部异常
响应格式
可返回简洁数据,也可带提示信息,无强制统一业务 code:
{
"message": "数据已存在"
}
后端处理
不同业务场景手动返回对应 HTTP 状态码。
前端处理(Axios)
- 2xx 进入 then
- 4xx/5xx 全部进入 catch
- 需要在 catch 里再细分:网络错误、404、409、500,分别做提示和处理
优点
- 严格遵循 REST 设计理念,语义直观
- 接口自解释,看状态码就知道业务结果
- 适合对外公开 API、第三方对接、开源项目
缺点
- 前端拦截器复杂度大幅提升,要在异常里处理业务提示
- 4xx/5xx 浏览器控制台标红,开发调试观感差
- 部分小程序、老旧客户端对非200状态码有兼容问题
- 统一全局弹窗、统一异常封装麻烦
适用场景
- 外企、海外项目、开源后端项目
- 对外提供开放平台 API、第三方调用接口
- 严格遵循 REST 架构设计的团队
对比总结
| 维度 | 规范一:全200+自定义业务码 | 规范二:RESTful HTTP语义码 |
|---|---|---|
| 设计核心 | HTTP只管通不通,业务靠内部code | HTTP直接表达业务结果 |
| 业务失败HTTP码 | 固定 200 | 用 400/404/409 等 |
| 前端接收位置 | 全部进 then | 2xx进then,4xx/5xx进catch |
| 统一提示 | 极易封装 | 复杂,需在异常分支处理 |
| 开发调试 | 控制台不标红,体验好 | 4xx/5xx 全部标红 |
| 兼容性 | 全平台无坑 | 部分移动端偶有兼容问题 |
| 主流使用 | 国内业务系统标配 | 开源、外企、开放API标配 |
| 推荐项目 | 内部管理系统、前后端分离业务项目 | 对外接口、开源服务 |
选型建议
做国内 Vue/React 后台、业务系统、内部项目
👉 强制选用:统一 HTTP 200 + 自定义业务码做对外开放平台、给第三方调用、开源项目
👉 选用:RESTful 原生 HTTP 状态码规范
国内规范中的 业务状态码规范
HTTP 状态码配合规则:
- 所有业务码,HTTP 状态码一律 200。
- 只有真正协议级错误才用非200:
- 400:请求参数格式非法(框架层面校验)
- 401:未鉴权拦截
- 404:接口地址不存在
- 500:代码未捕获异常
一、范式1:极简主流版
采用该规范的企业:美团、京东、大部分中小企业、后台管理系统
规则
- code = 0 → 成功
- code ≠ 0 → 失败
响应格式
{
"code": 0,
"msg": "操作成功",
"data": {...}
}
失败示例:
{
"code": 1001,
"msg": "标签名称已存在",
"data": null
}
特点
- 最简单、最好记
- 前端拦截器只需要一句:
if(res.data.code === 0) 成功 else 弹窗提示 - 绝大多数Vue后台、外包、中小企业、美团、京东都是这套
错误码分段示例
0成功1xxx通用业务错误2xxx用户登录权限错误3xxx各业务模块自定义错误
二、范式2:大厂规范派
采用该规范的企业:阿里、字节
响应格式
{
"code": 20000,
"msg": "操作成功",
"data": {}
}
业务码区间总体规划
| 码段区间 | 类型 | 说明 |
|---|---|---|
| 20000~20999 | 成功区间 | 所有正常操作成功 |
| 30000~30999 | 提示类 | 业务友好提示,不算错误 |
| 40000~40999 | 通用错误 | 参数、登录、权限、数据通用错误 |
| 50000~50999 | 业务自定义错误 | 各业务模块专属错误 |
| 60000~60999 | 系统级错误 | 服务器、数据库、第三方服务异常 |
细分业务码明细
1. 成功码 20000 段
| 业务码 | 含义 |
|---|---|
| 20000 | 操作成功 |
| 20001 | 查询成功 |
| 20002 | 新增成功 |
| 20003 | 修改成功 |
| 20004 | 删除成功 |
2. 通用错误 40000 段
40000 基础通用:
| 业务码 | 含义 |
|---|---|
| 40000 | 请求失败 |
| 40001 | 数据已存在 |
| 40002 | 数据不存在 |
| 40003 | 数据重复 |
| 40004 | 数据已禁用/已失效 |
40100 登录认证:
| 业务码 | 含义 |
|---|---|
| 40100 | 未登录 |
| 40101 | Token 无效 |
| 40102 | Token 已过期 |
| 40103 | 账号密码错误 |
| 40104 | 账号已被封禁 |
40300 权限相关:
| 业务码 | 含义 |
|---|---|
| 40300 | 无操作权限 |
| 40301 | 角色权限不足 |
| 40302 | 禁止访问该资源 |
40400 参数校验:
| 业务码 | 含义 |
|---|---|
| 40400 | 参数校验失败 |
| 40401 | 必填参数不能为空 |
| 40402 | 参数格式错误 |
| 40403 | 参数超出范围 |
业务模块错误 50000 段
规则:每个业务模块占 100 个号码
- 标签模块:50100~50199
- 用户模块:50200~50299
- 文件模块:50300~50399
示例:
| 业务码 | 含义 |
|---|---|
| 50100 | 标签名称已存在 |
| 50101 | 标签不存在 |
| 50102 | 标签关联数据无法删除 |
系统级错误 60000 段
| 业务码 | 含义 |
|---|---|
| 60000 | 服务器内部异常 |
| 60001 | 数据库操作失败 |
| 60002 | 第三方接口调用失败 |
| 60003 | 服务繁忙,请稍后重试 |
使用规则
- 正常业务成功 统一返回
20000。 - 数据已存在、不存在、重复 用 40001 / 40002 / 40003。
- 登录、Token、权限 走 401xx、403xx 区间。
- 表单参数校验 走 404xx 区间。
- 自己业务特有错误 用 50xxx 自定义,不占用通用码。
- 后端崩溃、数据库报错 用 60xxx。
一句话总结
- 成功全用 20000
- 通用错误 40xxx
- 业务专属 50xxx
- 系统异常 60xxx
- 所有接口 HTTP 固定 200
特点
- 偏大型大厂、规范更严谨
- 不用 0 做成功码,用 20000
- 分段更细,适合超大型团队多模块开发
为什么会有这两种?
1)0代表成功
追求简单、开发快、前后端好约定
适合:中小型项目、管理后台、外包、创业项目、普通公司
2)20000代表成功
追求规范、分区清晰、大型团队多业务模块隔离
适合:阿里、字节、大型中台、超复杂多模块系统
总结
国内业务状态码就两大派系:
- 极简派(最常用)
0成功- 非0 失败
- 适合 90% 普通前后端分离项目
- 大厂规范派
20000成功4xxxx通用错误5xxxx业务错误6xxxx系统错误- 适合大型团队、中台、大厂
选型建议
直接用:0 成功,非0 失败
理由:
- 最简单
- 前端拦截器最好写
- 对接别人接口最常见
- 自己开发不用记一堆数字