跳到主要内容

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

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

  • HTTP 状态码本质上是服务器对“这次请求结果”的分类反馈,按大类分为 1xx2xx3xx4xx5xx
  • 前端最常见且必须会解释的,是 200201204301302304400401403404409429500502503504
  • 面试官通常不在乎你能背多少数字,而在乎你能否说清:它表示谁的问题、客户端该怎么处理、是否可以重试
  • 401403 经常被问混,安全答法是: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 是上游超时。