HTTP 状态码

什么是 HTTP 状态码

HTTP 状态码是服务器对客户端请求的响应代码,用于表示请求的处理结果。每个状态码都是一个三位数字,第一位数字表示响应的类别。

状态码分类

HTTP 状态码按照第一位数字分为五个类别:

  • 1xx(信息性响应):请求已接收,继续处理
  • 2xx(成功响应):请求已成功被服务器接收、理解并处理
  • 3xx(重定向):需要后续操作才能完成这一请求
  • 4xx(客户端错误):请求包含错误语法或无法被执行
  • 5xx(服务器错误):服务器在处理请求的过程中发生了错误

常见状态码详解

1xx 信息性响应

100 Continue

  • 含义:服务器已接收到请求头,客户端应继续发送请求体
  • 使用场景:大文件上传时的预检查

101 Switching Protocols

  • 含义:服务器已理解请求,将通过 Upgrade 头字段切换协议
  • 使用场景:WebSocket 连接建立

2xx 成功响应

200 OK

  • 含义:请求成功,服务器已成功处理请求
  • 使用场景:GET、POST、PUT 等请求成功时的标准响应

201 Created

  • 含义:请求成功并且服务器创建了新的资源
  • 使用场景:POST 请求成功创建新资源后

204 No Content

  • 含义:服务器成功处理请求,但不需要返回任何实体内容
  • 使用场景:DELETE 请求成功执行后

206 Partial Content

  • 含义:服务器已经成功处理了部分 GET 请求
  • 使用场景:断点续传、视频流媒体传输

3xx 重定向

301 Moved Permanently

  • 含义:请求的资源已永久移动到新位置
  • 影响:搜索引擎会更新索引,浏览器会缓存重定向
  • 使用场景:网站迁移、URL 结构调整

302 Found

  • 含义:请求的资源临时移动到新位置
  • 影响:搜索引擎不会更新索引
  • 使用场景:临时维护页面跳转

304 Not Modified

  • 含义:资源未修改,可以使用缓存版本
  • 使用场景:条件 GET 请求,配合 ETag 或 Last-Modified 使用

307 Temporary Redirect

  • 含义:临时重定向,要求客户端保持请求方法不变
  • 与 302 区别:严格要求不改变 HTTP 方法

4xx 客户端错误

400 Bad Request

  • 含义:请求语法错误,服务器无法理解
  • 常见原因:参数格式错误、JSON 格式错误

401 Unauthorized

  • 含义:请求需要身份验证
  • 响应头:通常包含 WWW-Authenticate
  • 使用场景:访问受保护资源时未提供凭证

403 Forbidden

  • 含义:服务器理解请求但拒绝执行
  • 与 401 区别:403 表示服务器知道客户端身份但仍拒绝访问

404 Not Found

  • 含义:服务器无法找到请求的资源
  • 使用场景:URL 路径错误、资源已删除

405 Method Not Allowed

  • 含义:请求方法不被允许
  • 响应头:必须包含 Allow 头,指明允许的方法

409 Conflict

  • 含义:请求与服务器当前状态冲突
  • 使用场景:数据版本冲突、重复创建资源

429 Too Many Requests

  • 含义:客户端发送的请求过多
  • 响应头:可包含 Retry-After
  • 使用场景:API 限流保护

5xx 服务器错误

500 Internal Server Error

  • 含义:服务器遇到意外错误,无法完成请求
  • 常见原因:代码错误、数据库连接失败

502 Bad Gateway

  • 含义:网关或代理服务器从上游服务器收到无效响应
  • 使用场景:负载均衡器、CDN 与源服务器通信失败

503 Service Unavailable

  • 含义:服务器暂时无法处理请求
  • 响应头:可包含 Retry-After
  • 使用场景:服务器维护、过载保护

504 Gateway Timeout

  • 含义:网关或代理服务器等待上游响应超时
  • 使用场景:代理服务器与后端服务器通信超时

在实际开发中的应用

RESTful API 设计

1
2
3
4
5
6
GET /users/123          → 200 OK (获取成功)
POST /users → 201 Created (创建成功)
PUT /users/123 → 200 OK 或 204 No Content
DELETE /users/123 → 204 No Content
GET /users/999 → 404 Not Found
POST /users (数据错误) → 400 Bad Request

缓存策略

利用状态码实现高效缓存:

1
2
3
HTTP/1.1 304 Not Modified
ETag: "33a64df551"
Cache-Control: max-age=3600

选择合适的状态码

  1. 语义化原则:选择最能准确描述响应状态的代码
  2. 一致性原则:在整个应用中保持状态码使用的一致性