1. 简介

HTTP 状态码是我们在日常上网过程中频繁接触的机制,它是 HTTP 协议的一部分,用于描述客户端与服务器之间通信的结果。本文将带你了解 HTTP 状态码的分类体系,并深入解析最常见的一些状态码含义,帮助你在开发中更好地处理各种 HTTP 响应。

2. 什么是 HTTP?

HTTP(Hypertext Transfer Protocol)是互联网上客户端与服务器通信的标准协议。最初由 Tim Berners-Lee 提出,后续由 IETF(互联网工程任务组)维护并演进。HTTP 的各个版本通过 RFC(征求意见稿)文档发布,你可以在 RFC Editor 官网 查询详细信息。

HTTP 通信以“请求-响应”模式进行。当你在浏览器中输入网址、点击链接或提交表单时,浏览器会向服务器发送一个 HTTP 请求,服务器则返回一个包含状态码的响应。例如:

客户端请求:

GET / HTTP/1.1
Host: www.google.com

服务器响应:

HTTP/1.1 200 OK
Date: Sat, 12 Sep 2020 14:26:56 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=ISO-8859-1
Set-Cookie: ...truncated...
Accept-Ranges: none
Vary: Accept-Encoding
Transfer-Encoding: chunked

(html)

上述响应的第一行称为状态行,包含协议版本、状态码和状态描述。比如 200 OK 表示请求成功。接下来我们将详细介绍这些状态码的含义。

3. HTTP 状态码分类

HTTP 状态码是一个三位数字,用于表示服务器对请求的处理结果。它不是给用户看的,而是供客户端(如浏览器、API 调用程序)解析并采取相应操作的依据。

状态码分为五大类,按首位数字划分:

  • 1xx(信息响应):请求已收到,正在处理
  • 2xx(成功):请求已成功接收并处理
  • 3xx(重定向):需进一步操作才能完成请求
  • 4xx(客户端错误):请求有误或无法处理
  • 5xx(服务器错误):服务器处理请求时出错

根据这个分类,我们可以很快判断一个请求是否成功。比如前面的例子返回了 200,说明服务器处理成功。

接下来我们重点介绍一些常见状态码。

3.1 200 OK

含义:请求成功,适用于 GET、POST、PUT、PATCH、DELETE 等方法。

示例:GET 请求返回了请求的 HTML 页面内容。

⚠️ 注意:200 状态码通常表示成功,但不代表业务逻辑一定正确,需结合返回内容判断。

3.2 201 Created

含义:请求成功并创建了新资源,常用于 POST 请求。

典型场景:创建用户、上传文件等操作。

3.3 301 Moved Permanently

含义:资源已永久移动到新位置,响应中包含 Location 头,客户端应据此重定向。

⚠️ SEO 友好:搜索引擎会更新索引到新地址。

3.4 400 Bad Request

含义:客户端请求格式错误,服务器无法解析。

常见原因

  • JSON 格式错误
  • 参数缺失或类型错误
  • URL 编码问题

3.5 401 Unauthorized

含义:未提供有效身份认证信息。

附加要求:服务器应返回 WWW-Authenticate 头,说明支持的认证方式。

⚠️ 注意:401 强调“未认证”,不是“权限不足”。

3.6 403 Forbidden

含义:服务器拒绝执行请求,即使身份已认证。

常见原因

  • 权限不足
  • IP 被封禁
  • Token 有效但无访问权限

⚠️ 区别 401:401 是“你没登录”,403 是“你登录了但没权限”。

3.7 404 Not Found

含义:请求的资源不存在。

常见场景

  • URL 错误
  • 页面被删除

示例请求:

POST /test HTTP/1.1
Host: www.google.com

响应示例:

HTTP/1.1 404 Not Found
Content-Type: text/html; charset=UTF-8
Date: Sat, 12 Sep 2020 16:38:02 GMT
Content-Length: 1565

3.8 405 Method Not Allowed

含义:请求方法不被服务器支持。

附加要求:服务器应返回 Allow 头,列出支持的请求方法。

示例请求:

DELETE / HTTP/1.1
Host: www.google.com

响应示例:

HTTP/1.1 405 Method Not Allowed
Allow: GET, HEAD

3.9 408 Request Timeout

含义:客户端未在服务器等待时间内完成请求。

常见原因

  • 客户端发送请求太慢
  • 网络延迟严重

⚠️ 建议:检查网络质量或客户端超时设置。

3.10 413 Payload Too Large

含义:请求体过大,服务器拒绝处理。

常见场景

  • 上传大文件
  • JSON 数据过大

⚠️ 建议:优化请求体大小,或联系服务端调整限制。

3.11 500 Internal Server Error

含义:服务器内部错误,无法处理请求。

常见原因

  • 代码异常
  • 配置错误
  • 依赖服务故障

⚠️ 踩坑提示:这类错误通常需要查看服务端日志才能定位。

3.12 429 Too Many Requests

含义:请求频率超过服务器限制。

典型用途:限流机制,保护服务不被滥用。

建议:实现重试逻辑 + 限流降级策略。

3.13 418 I'm a teapot

含义:彩蛋状态码,来自 1998 年的愚人节 RFC(RFC 2324),不是正式标准。

趣味体验:访问 https://www.google.com/teapot 可以看到效果。

4. 未分配的 HTTP 状态码

HTTP 状态码是可扩展的,IANA 维护了官方的 HTTP 状态码注册表。以下是一些尚未被官方使用的状态码范围,可作为自定义扩展使用:

104–199
209–225
227–299
309–399
418–420
427
430
432–450
452–499
509
512–599

⚠️ 建议:除非有特殊需求,否则尽量使用标准状态码,避免引起客户端解析问题。

5. 总结

HTTP 状态码是 Web 通信中不可或缺的一部分,它们帮助我们快速判断请求的处理状态。本文梳理了常见状态码的含义、使用场景及注意事项,并介绍了未分配状态码的范围。掌握这些状态码有助于我们在开发中更高效地调试、处理异常和优化接口交互。

关键点回顾

  • 2xx 表示成功
  • 3xx 指向重定向
  • 4xx 是客户端错误
  • 5xx 是服务器错误
  • 状态码不是万能的,需结合业务逻辑判断

掌握这些状态码,有助于你在构建健壮的 Web 应用或 API 接口时,更从容地应对各种请求响应情况。


原始标题:HTTP Status Codes