HTTP 常见状态码有哪些?
一句话回答
状态码分五类:1xx 信息、2xx 成功、3xx 重定向、4xx 客户端错误、5xx 服务端错误。最常考的几组是:301 / 302 永久和临时重定向,304 协商缓存命中,401 / 403 未认证和没有权限,502 / 504 网关收到上游的无效响应和等待上游超时。
详细解析
五类状态码
| 类别 | 含义 |
|---|---|
| 1xx 信息 | 请求已收到,还需要继续处理 |
| 2xx 成功 | 请求被成功处理 |
| 3xx 重定向 | 需要客户端进一步操作,比如跳到新地址 |
| 4xx 客户端错误 | 请求本身有问题,比如参数错误、没有权限、资源不存在 |
| 5xx 服务端错误 | 请求没问题,服务器处理时出了错 |
常见状态码
| 状态码 | 含义 | 典型场景 |
|---|---|---|
| 101 Switching Protocols | 切换协议 | WebSocket 握手,从 HTTP 升级到 WebSocket(见 WebSocket) |
| 200 OK | 成功 | 绝大多数正常的请求 |
| 201 Created | 已创建新资源 | POST 创建资源成功,可以在 Location 头里返回新资源的地址 |
| 204 No Content | 成功,但没有响应体 | DELETE 成功、CORS 预检请求的响应 |
| 206 Partial Content | 返回了部分内容 | 范围请求,用于断点续传、视频拖动播放(见 大文件上传) |
| 301 Moved Permanently | 永久重定向 | 网站换域名。浏览器会缓存这个跳转,搜索引擎会把权重转移到新地址 |
| 302 Found | 临时重定向 | 未登录时跳转到登录页 |
| 304 Not Modified | 资源没变,继续用本地缓存 | 协商缓存命中(见 HTTP 缓存) |
| 307 Temporary Redirect | 临时重定向,不改变请求方法和请求体 | 临时把 POST 接口转到新地址 |
| 308 Permanent Redirect | 永久重定向,不改变请求方法和请求体 | API 地址永久迁移 |
| 400 Bad Request | 请求有误 | 参数校验失败、JSON 格式错误 |
| 401 Unauthorized | 未认证 | 没有登录、token 过期 |
| 403 Forbidden | 已认证,但没有权限 | 普通用户访问管理员接口 |
| 404 Not Found | 资源不存在 | 路径写错、资源已删除 |
| 405 Method Not Allowed | 不支持这个请求方法 | 对只支持 GET 的接口发 POST |
| 409 Conflict | 和资源的当前状态冲突 | 重复创建、并发修改导致版本冲突 |
| 413 Content Too Large | 请求体过大(旧称 Payload Too Large) | 上传的文件超过服务器限制,比如 Nginx 的 client_max_body_size |
| 429 Too Many Requests | 请求太频繁 | 触发限流,可以用 Retry-After 头告诉客户端多久后再试 |
| 500 Internal Server Error | 服务器内部错误 | 代码抛出了未捕获的异常 |
| 502 Bad Gateway | 网关或代理从上游服务收到了无效响应 | 上游服务挂了或崩溃 |
| 503 Service Unavailable | 服务暂时不可用 | 服务过载、维护中 |
| 504 Gateway Timeout | 网关等待上游响应超时 | 上游处理太慢,比如遇到慢查询 |
301、302、307、308 怎么区分
| 可能把 POST 改成 GET | 保证不改变请求方法和请求体 | |
|---|---|---|
| 永久重定向 | 301 | 308 |
| 临时重定向 | 302 | 307 |
浏览器收到 301、302 后,可能把原来的 POST 请求改成 GET 去请求新地址,这是历史遗留的行为,规范后来也允许了。307 和 308 就是为了明确"请求方法和请求体保持不变"而补充的。另外还有 303 See Other,它明确要求改用 GET 请求新地址,常用于提交表单后跳转到结果页。
状态码和业务错误码
HTTP 状态码表示请求层面的结果,粒度比较粗;具体的业务原因(如"库存不足""优惠券已过期")放在响应体的业务码里。比如登录失效统一返回 401,再用响应体里的 code 区分是 token 过期还是账号在别处登录。接口设计规范见 RESTful API 设计。
面试官可能追问
401 和 403 有什么区别?
401 是"不知道你是谁":没带凭证或者凭证失效,重新登录、刷新 token 后就可能访问成功。规范要求 401 响应带上 WWW-Authenticate 头,说明认证方式。403 是"知道你是谁,但你没有权限",重新登录也没用。前端一般对 401 跳转登录页或刷新 token,对 403 提示无权限。有些服务对没有权限的资源直接返回 404,连资源是否存在都不暴露。
502 和 504 有什么区别?分别怎么排查?
两者都由网关(如 Nginx)返回,问题通常出在上游服务。
- 502:网关连接上游失败(比如连接被拒绝),或者收到了无效的响应。常见原因是上游进程挂了、端口没在监听、处理请求时崩溃断开了连接。排查时看上游进程是否存活、端口是否在监听,以及网关的错误日志
- 504:上游还活着,但没有在网关的超时时间(如 Nginx 的
proxy_read_timeout)内返回响应。排查时看上游的慢日志、慢 SQL 和依赖的第三方接口,必要时把耗时任务改成异步(见 接口请求很慢怎么排查)
为什么有些项目所有接口都返回 200?利弊是什么?
好处是前端只需要按响应体里的业务码处理,逻辑统一;很多请求库(如 axios)默认把非 2xx 的响应当成异常,统一返回 200 写起来更省事。坏处是违背了 HTTP 语义:监控和网关无法按状态码统计错误率、触发告警;错误响应可能被 CDN 或浏览器当成正常结果缓存;排查问题时必须解析响应体。比较推荐的做法是用 HTTP 状态码表示大类,用业务码表示细节。
易错点
- 304 不是错误,它表示协商缓存命中,浏览器继续使用本地缓存
- 401 的名字叫 Unauthorized,实际含义是"未认证";"没有权限"应该用 403
- 502、504 都由网关返回,但问题通常出在上游服务,不是网关本身
AI 模拟面试官
用自己的话回答,AI 对照参考答案打分、指出遗漏,再追问,最多 3 轮
这道题你掌握了吗?
选一个最接近的状态,没掌握的题会出现在"我的进度 · 待复习"里。
学习记录暂存在本机浏览器。登录后自动同步到账号,换设备也能看到。