HTTP 状态码表示服务器对这次请求的处理结果,位于响应报文的状态行中。

分类

  • 1xx:信息响应,请求已收到,需要继续处理。
  • 2xx:成功,请求已经被服务器正确接收、理解、处理。
  • 3xx:重定向,需要客户端采取进一步操作。
  • 4xx:客户端错误,请求本身有问题,或客户端没有权限。
  • 5xx:服务器错误,服务器处理请求时出错。

常见状态码

1xx 信息响应

  • 100 Continue:客户端可以继续发送请求体。常见于先发请求头、等待服务器确认后再发大文件。
  • 101 Switching Protocols:服务器同意切换协议,例如 HTTP 升级为 WebSocket。

2xx 成功

  • 200 OK:请求成功,最常见的成功状态。
  • 201 Created:资源创建成功,常用于 POST 新建资源。
  • 202 Accepted:请求已接受,但尚未处理完成,常用于异步任务。
  • 204 No Content:请求成功,但响应体为空,常用于 DELETE 或保存成功后不返回内容。
  • 206 Partial Content:返回部分内容,常用于断点续传、视频拖动播放。

3xx 重定向

  • 301 Moved Permanently:永久重定向,浏览器和搜索引擎会倾向于缓存新的地址。
  • 302 Found:临时重定向,旧地址仍然有效。
  • 303 See Other:让客户端用 GET 请求另一个地址,常用于表单提交后跳转结果页。
  • 304 Not Modified:资源未修改,客户端可以继续使用本地缓存。它通常和 If-None-MatchIf-Modified-Since 等请求头配合。
  • 307 Temporary Redirect:临时重定向,但必须保持原请求方法和请求体。
  • 308 Permanent Redirect:永久重定向,但必须保持原请求方法和请求体。

301/302 在一些客户端中可能把 POST 改成 GET;307/308 明确要求不改变请求方法。

4xx 客户端错误

  • 400 Bad Request:请求格式错误,服务器无法理解。
  • 401 Unauthorized:未认证,需要登录或提供有效凭证。
  • 403 Forbidden:已认证也没有权限访问。
  • 404 Not Found:请求的资源不存在。
  • 405 Method Not Allowed:请求方法不被允许,例如接口只支持 GET,却发了 POST。
  • 408 Request Timeout:请求超时。
  • 409 Conflict:请求与服务器当前状态冲突,例如重复提交、版本冲突。
  • 410 Gone:资源曾经存在,但现在已永久删除。
  • 413 Payload Too Large:请求体过大。
  • 415 Unsupported Media Type:请求体格式不支持,例如接口需要 JSON,却传了其他格式。
  • 422 Unprocessable Content:请求格式正确,但语义错误,例如字段校验失败。
  • 429 Too Many Requests:请求过于频繁,被限流。

5xx 服务器错误

  • 500 Internal Server Error:服务器内部错误,兜底型错误。
  • 501 Not Implemented:服务器不支持请求所需的功能。
  • 502 Bad Gateway:网关或代理从上游服务器收到无效响应。
  • 503 Service Unavailable:服务暂时不可用,可能是维护、过载或限流。
  • 504 Gateway Timeout:网关或代理等待上游服务器响应超时。

容易混淆

  • 401 vs 403:401 是“你是谁还没确认”,403 是“知道你是谁,但你不能访问”。
  • 404 vs 410:404 表示找不到;410 Gone 表示资源曾经存在,但现在已永久删除。
  • 502 vs 504:502 是上游返回了错误响应;504 是等上游响应等超时了。
  • HTTP 状态码 vs 业务状态码:HTTP 状态码描述协议层结果;响应体里的 code 通常描述业务层结果。比如 HTTP 200 只说明请求成功到达并被处理,不一定代表业务成功。

reference

状态行 HTTP 响应报文 浏览器缓存策略