Skip to content

HTTP 状态码完整对照表:从 1xx 到 5xx 全解析

本文档提供完整的 HTTP 状态码对照表,包含所有标准状态码的详细说明、使用场景和最佳实践。

目录

  1. 1xx 信息性响应
  2. 2xx 成功响应
  3. 3xx 重定向
  4. 4xx 客户端错误
  5. 5xx 服务器错误
  6. WebDAV 扩展状态码
  7. 最佳实践

1xx 信息性响应

1xx 状态码表示临时响应,用于告知客户端请求已收到,继续处理。

状态码状态名称说明使用场景
100Continue继续客户端应继续发送请求体,服务器已准备好接收
101Switching Protocols切换协议服务器同意切换协议(如 WebSocket)
102Processing处理中服务器已收到并正在处理请求,但无响应可用
103Early Hints早期提示用于预加载资源,在最终响应前发送

详细说明

100 Continue

  • 用途:客户端发送带有较大请求体的请求时使用

  • 场景:文件上传、POST 大量数据

  • 示例

    http
    POST /upload HTTP/1.1
    Content-Length: 1024
    Expect: 100-continue
    
    HTTP/1.1 100 Continue
    
    [请求体数据]

101 Switching Protocols

  • 用途:协议升级

  • 场景:HTTP 升级到 WebSocket、HTTP/1.1 升级到 HTTP/2

  • 示例

    http
    GET /chat HTTP/1.1
    Upgrade: websocket
    Connection: Upgrade
    
    HTTP/1.1 101 Switching Protocols
    Upgrade: websocket
    Connection: Upgrade

102 Processing (WebDAV)

  • 用途:长时间处理请求
  • 场景:WebDAV 批量操作

103 Early Hints

  • 用途:资源预加载提示
  • 场景:Link 预加载、DNS 预解析

2xx 成功响应

2xx 状态码表示请求已成功处理。

状态码状态名称说明使用场景
200OK请求成功通用成功响应
201Created创建成功资源创建成功
202Accepted已接受请求已接受,异步处理中
203Non-Authoritative Information非权威信息代理修改了原始响应
204No Content无内容请求成功但无返回内容
205Reset Content重置内容请求成功,重置文档视图
206Partial Content部分内容范围请求成功
207Multi-Status多状态WebDAV 多状态响应
208Already Reported已报告WebDAV 绑定已报告
226IM UsedIM 已使用实例操作已应用

详细说明

200 OK

  • 用途:请求成功处理

  • 场景:GET 请求、PUT 更新、POST 处理成功

  • 示例

    json
    HTTP/1.1 200 OK
    Content-Type: application/json
    
    {
      "status": "success",
      "data": {...}
    }

201 Created

  • 用途:资源创建成功

  • 场景:POST 创建新资源、PUT 创建资源

  • 最佳实践:返回新创建资源的 URI

  • 示例

    http
    POST /users HTTP/1.1
    
    HTTP/1.1 201 Created
    Location: /users/123
    Content-Type: application/json
    
    {
      "id": 123,
      "name": "张三",
      "created_at": "2025-01-27T10:00:00Z"
    }

202 Accepted

  • 用途:请求已接受,异步处理

  • 场景:异步任务、邮件发送、数据处理

  • 示例

    json
    HTTP/1.1 202 Accepted
    Content-Type: application/json
    
    {
      "message": "请求已接受",
      "task_id": "task-123",
      "status_url": "/tasks/task-123/status"
    }

204 No Content

  • 用途:请求成功但无返回内容

  • 场景:DELETE 成功、PUT 更新无返回

  • 示例

    http
    DELETE /users/123 HTTP/1.1
    
    HTTP/1.1 204 No Content

206 Partial Content

  • 用途:范围请求成功

  • 场景:断点续传、视频流、大文件下载

  • 示例

    http
    GET /video.mp4 HTTP/1.1
    Range: bytes=0-1023
    
    HTTP/1.1 206 Partial Content
    Content-Range: bytes 0-1023/2048
    Content-Length: 1024

3xx 重定向

3xx 状态码表示需要进一步操作来完成请求。

状态码状态名称说明使用场景
300Multiple Choices多种选择多个可选响应
301Moved Permanently永久移动URL 永久重定向
302Found临时移动URL 临时重定向
303See Other查看其他POST 后重定向到 GET
304Not Modified未修改缓存有效
305Use Proxy使用代理必须使用代理
307Temporary Redirect临时重定向保持方法的重定向
308Permanent Redirect永久重定向保持方法的永久重定向

详细说明

301 Moved Permanently

  • 用途:资源永久移动到新位置
  • 场景:域名迁移、URL 重构
  • 示例
    http
    HTTP/1.1 301 Moved Permanently
    Location: https://new-domain.com/new-path

302 Found

  • 用途:资源临时移动到新位置
  • 场景:临时维护、A/B 测试
  • 示例
    http
    HTTP/1.1 302 Found
    Location: /maintenance.html

304 Not Modified

  • 用途:缓存有效,无需重新传输

  • 场景:条件请求、缓存验证

  • 示例

    http
    GET /api/data HTTP/1.1
    If-None-Match: "etag-value"
    
    HTTP/1.1 304 Not Modified
    ETag: "etag-value"

307 Temporary Redirect

  • 用途:临时重定向,保持 HTTP 方法

  • 场景:POST 重定向到 POST

  • 示例

    http
    POST /old-api HTTP/1.1
    
    HTTP/1.1 307 Temporary Redirect
    Location: /new-api

4xx 客户端错误

4xx 状态码表示客户端请求有误。

状态码状态名称说明使用场景
400Bad Request请求错误请求语法错误
401Unauthorized未授权需要身份验证
402Payment Required需要付费保留使用
403Forbidden禁止访问服务器拒绝请求
404Not Found未找到资源不存在
405Method Not Allowed方法不允许HTTP 方法不支持
406Not Acceptable不可接受无法生成客户端接受的内容
407Proxy Authentication Required需要代理认证代理服务器认证
408Request Timeout请求超时请求超时
409Conflict冲突请求冲突
410Gone已删除资源永久删除
411Length Required需要长度缺少 Content-Length
412Precondition Failed前置条件失败前置条件不满足
413Payload Too Large载荷过大请求体过大
414URI Too LongURI 过长请求 URI 过长
415Unsupported Media Type不支持的媒体类型媒体类型不支持
416Range Not Satisfiable范围不可满足请求范围无效
417Expectation Failed期望失败Expect 头字段失败
418I'm a teapot我是茶壶愚人节笑话
421Misdirected Request错误定向请求请求定向错误
422Unprocessable Entity无法处理的实体语义错误
423Locked已锁定WebDAV 资源锁定
424Failed Dependency依赖失败WebDAV 依赖失败
425Too Early太早请求太早
426Upgrade Required需要升级需要升级协议
428Precondition Required需要前置条件需要条件请求
429Too Many Requests请求过多速率限制
431Request Header Fields Too Large请求头字段过大请求头过大
451Unavailable For Legal Reasons因法律原因不可用法律限制

详细说明

400 Bad Request

  • 用途:请求语法错误

  • 场景:JSON 格式错误、参数缺失

  • 示例

    json
    HTTP/1.1 400 Bad Request
    Content-Type: application/json
    
    {
      "error": "bad_request",
      "message": "请求参数格式错误",
      "details": {
        "field": "email",
        "issue": "invalid_format"
      }
    }

401 Unauthorized

  • 用途:需要身份验证

  • 场景:未登录、token 过期

  • 示例

    http
    HTTP/1.1 401 Unauthorized
    WWW-Authenticate: Bearer realm="API"
    Content-Type: application/json
    
    {
      "error": "unauthorized",
      "message": "需要有效的访问令牌"
    }

403 Forbidden

  • 用途:服务器拒绝请求

  • 场景:权限不足、IP 封禁

  • 示例

    json
    HTTP/1.1 403 Forbidden
    Content-Type: application/json
    
    {
      "error": "forbidden",
      "message": "没有权限访问此资源"
    }

404 Not Found

  • 用途:资源不存在

  • 场景:URL 错误、资源已删除

  • 示例

    json
    HTTP/1.1 404 Not Found
    Content-Type: application/json
    
    {
      "error": "not_found",
      "message": "请求的资源不存在"
    }

422 Unprocessable Entity

  • 用途:语义错误

  • 场景:验证失败、业务规则冲突

  • 示例

    json
    HTTP/1.1 422 Unprocessable Entity
    Content-Type: application/json
    
    {
      "error": "validation_failed",
      "message": "数据验证失败",
      "errors": [
        {
          "field": "email",
          "message": "邮箱格式不正确"
        }
      ]
    }

429 Too Many Requests

  • 用途:请求过多
  • 场景:API 限流、防止滥用
  • 示例
    http
    HTTP/1.1 429 Too Many Requests
    X-RateLimit-Limit: 1000
    X-RateLimit-Remaining: 0
    X-RateLimit-Reset: 1640995200
    Retry-After: 3600

5xx 服务器错误

5xx 状态码表示服务器内部错误。

状态码状态名称说明使用场景
500Internal Server Error内部服务器错误通用服务器错误
501Not Implemented未实现功能未实现
502Bad Gateway网关错误网关或代理错误
503Service Unavailable服务不可用服务临时不可用
504Gateway Timeout网关超时网关超时
505HTTP Version Not SupportedHTTP 版本不支持HTTP 版本不支持
506Variant Also Negotiates变体协商配置错误
507Insufficient Storage存储不足WebDAV 存储不足
508Loop Detected检测到循环WebDAV 无限循环
510Not Extended未扩展需要扩展
511Network Authentication Required需要网络认证网络访问控制

详细说明

500 Internal Server Error

  • 用途:通用服务器错误

  • 场景:未处理的异常、系统错误

  • 示例

    json
    HTTP/1.1 500 Internal Server Error
    Content-Type: application/json
    
    {
      "error": "internal_server_error",
      "message": "服务器内部错误",
      "request_id": "req-123456"
    }

502 Bad Gateway

  • 用途:网关或代理服务器错误

  • 场景:反向代理无法连接后端、CDN 错误

  • 示例

    http
    HTTP/1.1 502 Bad Gateway
    Content-Type: text/html
    
    <html>
      <head><title>502 Bad Gateway</title></head>
      <body>服务器暂时不可用,请稍后重试</body>
    </html>

503 Service Unavailable

  • 用途:服务临时不可用

  • 场景:维护模式、服务器过载

  • 示例

    http
    HTTP/1.1 503 Service Unavailable
    Retry-After: 3600
    Content-Type: application/json
    
    {
      "error": "service_unavailable",
      "message": "服务正在维护中",
      "retry_after": 3600
    }

504 Gateway Timeout

  • 用途:网关超时

  • 场景:上游服务器响应超时

  • 示例

    http
    HTTP/1.1 504 Gateway Timeout
    Content-Type: application/json
    
    {
      "error": "gateway_timeout",
      "message": "请求超时,请重试"
    }

WebDAV 扩展状态码

WebDAV 协议扩展的状态码。

状态码状态名称说明使用场景
207Multi-Status多状态多个操作结果
208Already Reported已报告绑定已报告
422Unprocessable Entity无法处理实体语义错误
423Locked已锁定资源被锁定
424Failed Dependency依赖失败依赖操作失败
507Insufficient Storage存储不足磁盘空间不足
508Loop Detected检测到循环无限循环

最佳实践

状态码选择原则

  1. 2xx 成功响应

    • 200 OK:通用成功
    • 201 Created:资源创建
    • 204 No Content:成功但无内容
    • 202 Accepted:异步处理
  2. 4xx 客户端错误

    • 400 Bad Request:请求格式错误
    • 401 Unauthorized:需要认证
    • 403 Forbidden:权限不足
    • 404 Not Found:资源不存在
    • 422 Unprocessable Entity:验证失败
    • 429 Too Many Requests:限流
  3. 5xx 服务器错误

    • 500 Internal Server Error:通用服务器错误
    • 502 Bad Gateway:网关错误
    • 503 Service Unavailable:服务不可用
    • 504 Gateway Timeout:超时

API 设计建议

typescript
// 标准响应格式
interface APIResponse<T = any> {
  status: number;
  message: string;
  data?: T;
  error?: {
    code: string;
    details?: any;
  };
  meta?: {
    request_id: string;
    timestamp: string;
    version: string;
  };
}

// 成功响应示例
const successResponse: APIResponse<User> = {
  status: 200,
  message: "获取用户信息成功",
  data: {
    id: 123,
    name: "张三",
    email: "zhangsan@example.com",
  },
  meta: {
    request_id: "req-123456",
    timestamp: "2025-01-27T10:00:00Z",
    version: "1.0.0",
  },
};

// 错误响应示例
const errorResponse: APIResponse = {
  status: 400,
  message: "请求参数错误",
  error: {
    code: "VALIDATION_ERROR",
    details: {
      field: "email",
      issue: "invalid_format",
    },
  },
  meta: {
    request_id: "req-123456",
    timestamp: "2025-01-27T10:00:00Z",
    version: "1.0.0",
  },
};

前端处理建议

typescript
// HTTP状态码处理
class HTTPStatusHandler {
  static handleResponse(response: Response): Promise<any> {
    const status = response.status;

    switch (true) {
      case status >= 200 && status < 300:
        return this.handleSuccess(response);

      case status >= 400 && status < 500:
        return this.handleClientError(response);

      case status >= 500:
        return this.handleServerError(response);

      default:
        throw new Error(`未知状态码: ${status}`);
    }
  }

  private static async handleSuccess(response: Response) {
    const contentType = response.headers.get("content-type");

    if (contentType?.includes("application/json")) {
      return await response.json();
    }

    return await response.text();
  }

  private static async handleClientError(response: Response) {
    const errorData = await response.json();

    switch (response.status) {
      case 400:
        throw new ValidationError(errorData.message, errorData.error?.details);

      case 401:
        throw new AuthenticationError(errorData.message);

      case 403:
        throw new AuthorizationError(errorData.message);

      case 404:
        throw new NotFoundError(errorData.message);

      case 422:
        throw new ValidationError(errorData.message, errorData.errors);

      case 429:
        throw new RateLimitError(
          errorData.message,
          response.headers.get("Retry-After")
        );

      default:
        throw new ClientError(errorData.message, response.status);
    }
  }

  private static async handleServerError(response: Response) {
    const errorData = await response.json();

    switch (response.status) {
      case 500:
        throw new InternalServerError(errorData.message, errorData.request_id);

      case 502:
        throw new BadGatewayError(errorData.message);

      case 503:
        throw new ServiceUnavailableError(
          errorData.message,
          response.headers.get("Retry-After")
        );

      case 504:
        throw new GatewayTimeoutError(errorData.message);

      default:
        throw new ServerError(errorData.message, response.status);
    }
  }
}

// 自定义错误类
class ValidationError extends Error {
  constructor(message: string, public details?: any) {
    super(message);
    this.name = "ValidationError";
  }
}

class AuthenticationError extends Error {
  constructor(message: string) {
    super(message);
    this.name = "AuthenticationError";
  }
}

class RateLimitError extends Error {
  constructor(message: string, public retryAfter?: string) {
    super(message);
    this.name = "RateLimitError";
  }
}

缓存策略

typescript
// 基于状态码的缓存策略
class CacheStrategy {
  static shouldCache(status: number): boolean {
    // 成功响应可缓存
    if (status >= 200 && status < 300) {
      return true;
    }

    // 重定向可缓存
    if (status >= 300 && status < 400) {
      return true;
    }

    // 客户端错误不缓存
    if (status >= 400 && status < 500) {
      return false;
    }

    // 服务器错误不缓存
    if (status >= 500) {
      return false;
    }

    return false;
  }

  static getCacheTTL(status: number): number {
    switch (status) {
      case 200:
        return 3600; // 1小时
      case 201:
        return 0; // 不缓存
      case 204:
        return 0; // 不缓存
      case 301:
        return 86400 * 365; // 1年
      case 302:
        return 3600; // 1小时
      case 304:
        return 3600; // 1小时
      default:
        return 0; // 不缓存
    }
  }
}

总结

HTTP 状态码是 Web 开发中的重要组成部分,正确使用状态码能够:

  1. 提高 API 可读性:清晰表达请求结果
  2. 改善用户体验:提供准确的错误信息
  3. 便于调试:快速定位问题
  4. 支持缓存:优化性能
  5. 符合标准:遵循 HTTP 规范

关键要点

  • 2xx:成功响应,根据操作类型选择合适的状态码
  • 3xx:重定向,注意 301 和 302 的区别
  • 4xx:客户端错误,提供详细的错误信息
  • 5xx:服务器错误,避免暴露敏感信息

推荐资源

通过合理使用这些状态码,可以构建更加健壮和用户友好的 Web 应用程序。

本站总访问