← 中文资源

简体中文版本

HTTP 状态码分类

按类别解析 HTTP 状态码,并提供可重试、可缓存、成功与错误等布尔标记供客户端逻辑使用。

阅读英文原文

功能说明

classifyStatus 接收三位状态码,返回类别编号、类别标签以及成功、重定向、错误、可重试和可缓存等布尔值。isRetryableStatus 是只关心重试的快捷入口。它适合封装 fetch 客户端、统一错误提示、决定退避策略以及判断响应能否进入缓存。将状态语义集中在一处,可以避免各个调用点散落魔法数字。

关键代码

函数先校验状态码必须是 100 到 599 的整数,再用除以一百取整得到类别,并从映射表读取标签。可重试集合包含请求超时、Too Early、限流、内部错误、网关错误、服务不可用和网关超时;可缓存集合覆盖常见的成功响应、永久重定向以及 404 与 410。返回对象每次新建,调用方可安全扩展字段。

使用注意

可重试判断是通用启发式,实际重试还要看请求方法是否幂等、是否已有副作用以及业务错误体。429 与 503 应结合 Retry-After 头决定等待时间,不能立即密集重放。301 与 308 的可缓存性还受响应头约束,本表只表示允许缓存而非一定缓存。100 与 101 等中间状态通常不会出现在最终响应对象中。

验证方式

遍历 100、200、204、301、304、400、404、429、500、503 等代表值,断言类别、标签与布尔标记符合预期。测试 99、600、200.5 与字符串输入会抛错。检查 304 被归为成功之外的类别但不算错误,404 可缓存但不可重试。最后验证快捷函数与完整分类结果一致。

代码示例

const RETRYABLE = new Set([408, 425, 429, 500, 502, 503, 504]);
const CACHEABLE = new Set([200, 203, 204, 206, 300, 301, 308, 404, 410]);

export function classifyStatus(status) {
  if (!Number.isInteger(status) || status < 100 || status > 599) {
    throw new RangeError("status must be a three-digit HTTP status code");
  }
  const group = Math.floor(status / 100);
  const labels = {
    1: "informational",
    2: "success",
    3: "redirect",
    4: "client-error",
    5: "server-error",
  };
  return {
    status,
    group,
    label: labels[group],
    success: group === 2,
    redirect: group === 3,
    error: group >= 4,
    retryable: RETRYABLE.has(status),
    cacheable: CACHEABLE.has(status),
  };
}

export function isRetryableStatus(status) {
  return classifyStatus(status).retryable;
}