在 REST 风格 API 设计中,响应状态应直接使用 HTTP 标准状态码作为核心语义载体,而不是仅在响应体中自定义业务码。HTTP 状态码是 API 契约的一部分,用于准确传达请求的宏观结果、业务状态或系统异常。

以下是规范的定义方法、典型映射表及最佳实践参考:

📦 一、HTTP 状态码分类与 REST 语义定义

根据 RFC 规范,状态码分为 5 个类别,在 REST API 中应这样理解与使用:

类别含义REST 场景定位
1xx信息性协议级握手信息,业务 API 极少使用
2xx成功请求已被服务器成功接收、理解并处理
3xx重定向需客户端执行额外操作(如缓存验证、URL 迁移)
4xx客户端错误请求语法、参数、权限或资源问题,责任在调用方
5xx服务器错误服务端内部异常、依赖不可用等,责任在服务方

📊 二、典型场景状态码对照表(可直接参考)

业务场景推荐状态码说明与响应体建议
查询成功(GET200 OK返回资源集合或单个对象
创建成功(POST201 Created建议返回新资源 URI 或完整资源体
更新成功(PUT/PATCH200 OK204 No Content返回更新后资源,或无响应体
删除成功(DELETE204 No Content通常不返回响应体;若需返回可用 200
参数/格式校验失败400 Bad Request响应体说明具体错误字段及原因
未认证 / 未登录401 Unauthorized缺少或无效的 Token/Cookie
已认证但无权限403 Forbidden角色/策略不允许执行该操作
请求的资源不存在404 Not FoundURI 指向的资源已被删除或路径错误
业务冲突(如重复提交)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 响应状态设计规范

  1. 状态码表达宏观结果,响应体补充微观信息
    HTTP 状态码负责路由处理分支(成功/客户端错/服务端错),响应体负责传递业务细节。例如 400 可返回:

    { "error": "VALIDATION_FAILED", "message": "手机号格式不正确", "field": "phone" }
    
  2. 幂等性需与状态码保持一致
    GETPUTDELETE 应为幂等。例如重复调用 DELETE /users/123,第二次可返回 404200,但团队内需统一约定。

  3. 工业界常见混合模式(可选)
    为兼容前端统一拦截或国际化提示,许多团队采用 HTTP 状态码 + JSON 业务码信封

    // 成功
    { "code": 0, "msg": "success", "data": { "id": 1, "name": "tom" } }
    // 失败(HTTP 状态码仍为 400)
    { "code": 1001, "msg": "手机号已存在", "data": null }
    

    此时 HTTP 状态码仍应严格按上述规范返回,内部 code 仅用于业务层路由或前端提示映射。

  4. 错误响应体建议结构

    {
      "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/204400/401/403/404/409500/503;可结合统一 JSON 信封使用

✅ 总结

REST API 的响应状态不需要自定义发明,应严格遵循 HTTP 标准状态码语义:

  • 2xx 表示成功,按操作类型细分(查询/创建/更新/删除)
  • 4xx 指向客户端问题(参数/权限/资源/业务冲突)
  • 5xx 指向服务端问题(异常/依赖/维护)
  • 响应体配合状态码提供可调试的业务细节,必要时可叠加内部业务码信封。
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐