跳到主要内容

常用 HTTP 状态码:别死背数字,要会按语义和场景回答

面试速答(30 秒版 TL;DR)​

  • HTTP 状态码本质上是服务器对“这次请求结果”的分类反馈,按大类分为 1xx、2xx、3xx、4xx、5xx。
  • 前端最常见且必须会解释的,是 200、201、204、301、302、304、400、401、403、404、409、429、500、502、503、504。
  • 面试官通常不在乎你能背多少数字,而在乎你能否说清:它表示谁的问题、客户端该怎么处理、是否可以重试。
  • 401 和 403 经常被问混,安全答法是:401 更偏“未认证”,403 更偏“已认证但无权限”。
  • 304 很特殊,它不是“请求失败”,而是缓存协商成功,告诉客户端可以直接用本地缓存。

先按大类建立心智模型​

范围含义面试怎么说
1xx信息性状态很少在前端业务里直接处理
2xx成功请求被成功接收/处理
3xx重定向资源位置或使用方式发生变化
4xx客户端问题请求有错、没权限、资源不存在
5xx服务端问题服务器处理失败或上游异常

一句话记忆:

  • 4xx 优先反思请求是不是有问题
  • 5xx 优先怀疑服务端或网关链路

高频 2xx​

200 OK​

最常见。表示请求成功,响应体里通常有业务数据。

201 Created​

资源创建成功,常用于新增接口,例如创建订单、创建用户。

202 Accepted​

服务器已接受请求,但还没处理完成,适合异步任务场景。

204 No Content​

请求成功,但没有响应体。
常见于删除成功、更新成功但不需要回传内容的接口。


高频 3xx​

301 Moved Permanently​

永久重定向。
浏览器、搜索引擎会更倾向于记住这个跳转关系。

302 Found​

临时重定向。
传统语义里表示临时跳转,但实际历史兼容复杂,很多客户端会把方法改成 GET。

303 See Other​

明确告诉客户端:请用 GET 去另一个地址取结果。
常见于表单提交后跳转结果页。

307 Temporary Redirect​

临时重定向,但要求保持原请求方法和请求体。

308 Permanent Redirect​

永久重定向,同时保持原方法。

304 Not Modified​

不是重定向到新地址,而是缓存协商结果:
资源没变,客户端继续用本地缓存即可。


高频 4xx​

400 Bad Request​

请求格式或参数有问题。
例如 JSON 非法、缺少必填字段、参数类型错误。

401 Unauthorized​

更准确理解是:未认证 或认证信息无效。
例如 Token 过期、未登录、签名错误。

403 Forbidden​

服务器理解请求,也识别你是谁,但拒绝你访问。
例如普通用户访问管理员资源。

404 Not Found​

资源不存在,或者服务器不愿暴露资源是否存在时也可能统一回 404。

405 Method Not Allowed​

资源存在,但不支持当前方法。
比如只支持 GET 的接口收到了 POST。

409 Conflict​

请求和当前资源状态冲突。
例如重复创建、版本冲突、乐观锁冲突。

410 Gone​

资源曾经存在,但现在被永久删除。

413 Payload Too Large​

请求体太大,例如上传文件超出限制。

415 Unsupported Media Type​

请求的内容类型服务器不支持,例如接口只接受 application/json,你却发了别的格式。

422 Unprocessable Content​

语法能解析,但语义校验不过。
例如字段格式正确,但业务规则不满足。

429 Too Many Requests​

触发限流。
这类响应通常可以结合 Retry-After 头决定何时重试。


高频 5xx​

500 Internal Server Error​

通用服务端错误。
往往说明程序处理过程中抛错,但没有更细分的状态码。

501 Not Implemented​

服务器不支持当前请求所需功能。

502 Bad Gateway​

网关或反向代理从上游拿到了无效响应。
常见于 Nginx、网关、API Gateway 代理后端接口的场景。

503 Service Unavailable​

服务暂时不可用,常见于过载、维护、熔断。

504 Gateway Timeout​

网关等待上游响应超时。
和 502 的区别是:502 偏“拿到坏响应”,504 偏“根本等超时了”。


前端面试里最容易追问的几组区别​

1. 401 vs 403​

  • 401:你还没通过身份认证,或者认证失败。
  • 403:你身份没问题,但权限不够。

2. 301/302 vs 307/308​

  • 301/302:历史兼容复杂,很多客户端会改请求方法。
  • 307/308:明确要求保留原方法和请求体。

3. 502 vs 504​

  • 502:上游回了不合法/异常响应。
  • 504:上游迟迟没回,网关超时。

4. 200 vs 204​

  • 200:通常有响应体。
  • 204:成功但无响应体。

前端处理状态码的实战思路​

1. 不要只看状态码,还要看业务码​

很多业务系统会在 200 里再包一层业务码,例如:

{
"code": 10001,
"message": "库存不足",
"data": null
}

这时 HTTP 层是成功,业务层是失败。两层语义别混。

2. 对可重试状态做分级​

一般可以考虑重试的场景:

  • 429
  • 502
  • 503
  • 504

但要配合幂等性、退避重试和上限控制,不能无脑打爆服务端。

3. 对鉴权类状态统一处理​

例如:

  • 401:跳登录、刷新 Token、清理本地登录态
  • 403:展示无权限页面或弱提示

高频题标准答法​

1. 304 算成功还是失败?​

严格说它不是业务失败,而是缓存协商成功的一种结果。
客户端应该直接使用本地缓存内容。

2. 为什么有些接口明明报业务错,却还返回 200?​

因为 HTTP 状态码描述的是“HTTP 这一层请求是否成功送达并被处理”,不等于业务一定成功。
很多团队会在响应体里再定义业务码。

3. 删除接口应该返回 200 还是 204?​

都可以,但语义不同:

  • 要返回内容,例如最新资源状态,用 200
  • 成功但无需响应体,用 204

易错点 / 坑​

  • 把 401 翻译成“没权限”。
  • 误以为 304 是错误码。
  • 看到 500 就只会说“后端挂了”,却说不出可能是应用异常、网关链路、依赖超时等多种原因。
  • 只背 200/404/500,不会结合真实接口场景回答。

速记要点(可背诵)​

  • 2xx 成功,3xx 重定向/缓存协商,4xx 客户端问题,5xx 服务端问题。
  • 401 未认证,403 已认证但无权限。
  • 304 让客户端继续用缓存。
  • 502 是上游坏响应,504 是上游超时。