HTTP 状态码

状态码按 2xx/3xx/4xx/5xx 表达结果:400 参数问题、401 未认证、403 无权限、404 不存在、409 冲突、422 语义错误、429 限流、503 暂不可用。

HTTP 状态码是什么

状态码用三位数字表达请求结果,按首位分成五类:1xx 信息、2xx 成功、3xx 重定向、4xx 客户端错误、5xx 服务端错误。它是接口契约的一部分:客户端重试策略、网关熔断、监控告警与值班排障全都依赖它判断请求该怎么处理。

最容易混的几对

401 表示未认证,也就是缺少或凭证无效;403 表示已认证但无权限。两者混用会让客户端不知道该引导登录还是提示无权访问。409 用于并发写冲突与状态不允许,422 用于参数格式正确但语义不合法。权限不足时返回 404 是一种资源遮蔽手段,能减少枚举探测,代价是可调试性下降。

常用状态码

状态码含义常见误用
400请求语法或参数错误把业务校验失败一律归为 400
401 与 403未认证与无权限混淆两者,客户端无法区分引导动作
404 与 410不存在与已删除权限不足时用 404 掩盖,排障困难
409状态冲突并发写冲突未返回 409,客户端无法判断
422语义不合法与 400 混用,校验失败粒度丢失
429请求过多不携带重试等待时间
503服务暂不可用用 500 代替,掩盖过载与维护状态

基本信息

分类1xx 信息、2xx 成功、3xx 重定向、4xx 客户端错误、5xx 服务端错误
幂等语义GET、PUT、DELETE 应当幂等,POST 不保证
重试判断5xx 与 429 可退避重试,4xx 通常不应重试
监控口径告警通常只对 5xx 与 429 设阈值

典型使用场景

  • 接口设计:约定成功、参数错误、冲突与限流的返回码
  • 客户端处理:区分可重试的 5xx 与不可重试的 4xx
  • 监控告警:按状态码分类统计,避免噪音淹没真实故障
  • 网关治理:依据状态码做熔断统计与降级决策
  • 问题定位:以状态码快速判断问题归属在调用方还是服务方
4xx 表示客户端需要修改请求,5xx 表示服务端自身有问题。这个区分决定了修复方向,也决定了告警该叫醒谁,因此不要为了掩盖实现问题把 5xx 改写成 400。

易错点

  • 所有错误一律返回 200 加错误码,网关与监控失去判断依据
  • 对不存在的资源返回 500,掩盖了调用方的参数问题
  • 限流返回 429 但不带重试等待时间,客户端只能盲目重试
  • 调用方对所有 5xx 无差别重试,包括本不该重试的写操作

数据来源与参考

  • RFC 9110 HTTP Semantics
  • RFC 6585:Additional HTTP Status Codes
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌