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-Match、If-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 只说明请求成功到达并被处理,不一定代表业务成功。