REST 风格 API 设计
·
在 REST 风格 API 设计中,响应状态应直接使用 HTTP 标准状态码作为核心语义载体,而不是仅在响应体中自定义业务码。HTTP 状态码是 API 契约的一部分,用于准确传达请求的宏观结果、业务状态或系统异常。
以下是规范的定义方法、典型映射表及最佳实践参考:
📦 一、HTTP 状态码分类与 REST 语义定义
根据 RFC 规范,状态码分为 5 个类别,在 REST API 中应这样理解与使用:
| 类别 | 含义 | REST 场景定位 |
|---|---|---|
1xx | 信息性 | 协议级握手信息,业务 API 极少使用 |
2xx | 成功 | 请求已被服务器成功接收、理解并处理 |
3xx | 重定向 | 需客户端执行额外操作(如缓存验证、URL 迁移) |
4xx | 客户端错误 | 请求语法、参数、权限或资源问题,责任在调用方 |
5xx | 服务器错误 | 服务端内部异常、依赖不可用等,责任在服务方 |
📊 二、典型场景状态码对照表(可直接参考)
| 业务场景 | 推荐状态码 | 说明与响应体建议 |
|---|---|---|
查询成功(GET) | 200 OK | 返回资源集合或单个对象 |
创建成功(POST) | 201 Created | 建议返回新资源 URI 或完整资源体 |
更新成功(PUT/PATCH) | 200 OK 或 204 No Content | 返回更新后资源,或无响应体 |
删除成功(DELETE) | 204 No Content | 通常不返回响应体;若需返回可用 200 |
| 参数/格式校验失败 | 400 Bad Request | 响应体说明具体错误字段及原因 |
| 未认证 / 未登录 | 401 Unauthorized | 缺少或无效的 Token/Cookie |
| 已认证但无权限 | 403 Forbidden | 角色/策略不允许执行该操作 |
| 请求的资源不存在 | 404 Not Found | URI 指向的资源已被删除或路径错误 |
| 业务冲突(如重复提交) | 409 Conflict | 唯一约束冲突、状态机不允许等 |
| 触发限流/频率限制 | 429 Too Many Requests | 配合 Retry-After 头使用 |
| 服务端未捕获异常 | 500 Internal Server Error | 记录 TraceId,响应体仅提示“系统繁忙” |
| 服务降级 / 维护中 | 503 Service Unavailable | 配合 Retry-After 头,提示稍后重试 |
| 客户端缓存未过期 | 304 Not Modified | 配合 ETag / Last-Modified 实现缓存协商 |
💡 注意:避免所有请求都返回
200,再通过 JSON 中的code判断成败。这会破坏 HTTP 协议语义,导致网关监控、SDK 自动重试、熔断器等基础设施失效。
🛠 三、REST 响应状态设计规范
-
状态码表达宏观结果,响应体补充微观信息
HTTP 状态码负责路由处理分支(成功/客户端错/服务端错),响应体负责传递业务细节。例如400可返回:{ "error": "VALIDATION_FAILED", "message": "手机号格式不正确", "field": "phone" } -
幂等性需与状态码保持一致
GET、PUT、DELETE应为幂等。例如重复调用DELETE /users/123,第二次可返回404或200,但团队内需统一约定。 -
工业界常见混合模式(可选)
为兼容前端统一拦截或国际化提示,许多团队采用 HTTP 状态码 + JSON 业务码信封:// 成功 { "code": 0, "msg": "success", "data": { "id": 1, "name": "tom" } } // 失败(HTTP 状态码仍为 400) { "code": 1001, "msg": "手机号已存在", "data": null }此时 HTTP 状态码仍应严格按上述规范返回,内部
code仅用于业务层路由或前端提示映射。 -
错误响应体建议结构
{ "code": "RESOURCE_CONFLICT", "message": "该手机号已被注册", "requestId": "req_8f3a2c1d", "details": { "field": "phone", "value": "13800138000" } }
📚 四、权威参考标准
| 来源 | 核心建议 |
|---|---|
| RFC 9110 / RFC 7231(HTTP 语义官方规范) | 明确状态码分类、使用场景及幂等要求,替代旧版 RFC 2616 |
| Richardson Maturity Model (RMM) Level 2 | 要求正确使用 HTTP 方法 + 标准状态码,是 RESTful 的核心标志 |
| Google API Design Guide | 强调“状态码即语义”,反对滥用 200 包装错误 |
| 阿里云 / 腾讯云 API 规范 | 推荐 2xx/4xx/5xx 分层使用,错误响应需含 RequestId 便于排查 |
| 本知识库参考 | 状态码分 5 类;常用 200/201/204、400/401/403/404/409、500/503;可结合统一 JSON 信封使用 |
✅ 总结
REST API 的响应状态不需要自定义发明,应严格遵循 HTTP 标准状态码语义:
2xx表示成功,按操作类型细分(查询/创建/更新/删除)4xx指向客户端问题(参数/权限/资源/业务冲突)5xx指向服务端问题(异常/依赖/维护)- 响应体配合状态码提供可调试的业务细节,必要时可叠加内部业务码信封。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)