常用 HTTP 状态码速查
HTTP 状态码是服务器对请求处理结果的“标准回复”。
前端开发里,你几乎每天都会看到它们:
- 请求成功了吗?
- 是我参数写错了,还是服务端挂了?
- 要不要提示用户重试、登录、或者联系管理员?
这篇文档会用通俗方式讲清楚常用状态码,并结合前端场景给出处理建议。
一、先记住总分类
HTTP 状态码是三位数字,按首位分为 5 大类:
| 范围 | 含义 | 你可以理解成 |
|---|---|---|
| 1xx | 信息性状态 | “收到请求了,继续” |
| 2xx | 成功 | “处理成功” |
| 3xx | 重定向 | “资源位置变了,去别处” |
| 4xx | 客户端错误 | “你的请求有问题” |
| 5xx | 服务端错误 | “服务器出问题了” |
二、最常用的状态码(前端高频)
下面这些是前端项目中最常见、最值得重点掌握的。
200 OK
含义:请求成功,服务器返回了你需要的数据。
常见场景:
GET /api/user/profile成功返回用户信息POST /api/login登录成功
HTTP/1.1 200 OK
Content-Type: application/json
{"id": 1, "name": "Alice"}
201 Created
含义:请求成功,并且服务器新建了资源。
常见场景:
- 创建文章
- 新增评论
- 新建订单
HTTP/1.1 201 Created
Location: /api/posts/101
提示:
201往往搭配Location头部,告诉你新资源地址。
204 No Content
含义:请求成功,但响应体为空。
常见场景:
- 删除成功(DELETE)
- 更新成功但不返回详情
HTTP/1.1 204 No Content
前端注意:
204不要再调用response.json(),否则可能报错。
301 Moved Permanently / 302 Found / 307 Temporary Redirect / 308 Permanent Redirect
含义:资源被重定向。
301/308:永久重定向302/307:临时重定向
常见场景:
http://自动跳到https://- 旧接口地址跳到新地址
HTTP/1.1 301 Moved Permanently
Location: https://example.com/new-path
304 Not Modified
含义:资源没有变化,可以继续使用缓存。
常见场景:
- 浏览器缓存命中(配合
ETag/If-None-Match)
价值:减少流量和加载时间。
400 Bad Request
含义:请求格式或参数有误。
常见场景:
- JSON 格式错误
- 参数类型不对
- 必填字段缺失
{
"message": "邮箱格式不正确"
}
401 Unauthorized
含义:未认证(通常是未登录或 token 无效)。
常见场景:
- token 过期
- 请求没带
Authorization
前端常见处理:
- 清理本地登录态
- 跳转登录页
- 登录后回跳原页面
403 Forbidden
含义:已认证,但无权限。
常见场景:
- 普通用户访问管理员接口
- 账号被封禁
区分记忆:
401是“你还没证明你是谁”,403是“我知道你是谁,但你不能做这件事”。
404 Not Found
含义:资源不存在。
常见场景:
- 接口路径写错
- 请求的文章/商品已被删除
- 前端路由未匹配
409 Conflict
含义:请求与当前资源状态冲突。
常见场景:
- 用户名已存在
- 并发更新冲突(版本号不一致)
422 Unprocessable Content
含义:请求格式正确,但业务校验失败。
常见场景:
- 表单字段不满足规则(密码太短、日期范围不合法)
和
400的区别:400更偏“格式层面错误”,422更偏“业务规则不通过”。
429 Too Many Requests
含义:请求太频繁,被限流。
常见场景:
- 短时间重复发送验证码
- 爬虫/突发流量超限
HTTP/1.1 429 Too Many Requests
Retry-After: 60
前端可做:
- 禁用按钮倒计时
- 读取
Retry-After后再重试
500 Internal Server Error
含义:服务器内部错误(通用兜底)。
常见场景:
- 代码异常
- 未捕获错误
502 Bad Gateway / 503 Service Unavailable / 504 Gateway Timeout
这些常见于网关、反向代理、微服务架构:
502:上游服务返回异常503:服务暂时不可用(维护/过载)504:网关等待上游响应超时
前端建议统一提示:
- “服务繁忙,请稍后重试”
- 配合重试机制(避免无限重试)
三、前端错误处理实战流程
四、Fetch/Axios 代码示例
Fetch 示例
async function requestUserProfile() {
const res = await fetch('/api/user/profile', {
headers: {
Authorization: `Bearer ${localStorage.getItem('token') ?? ''}`,
},
});
if (res.status === 401) {
localStorage.removeItem('token');
window.location.href = '/login?redirect=/profile';
return;
}
if (res.status === 403) {
throw new Error('无权限访问该资源');
}
if (res.status === 404) {
return null;
}
if (!res.ok) {
throw new Error(`请求失败,状态码:${res.status}`);
}
return res.json();
}
Axios 响应拦截器示例
import axios from 'axios';
const http = axios.create({
baseURL: '/api',
timeout: 10000,
});
http.interceptors.response.use(
(response) => response,
(error) => {
const status = error?.response?.status;
if (status === 401) {
localStorage.removeItem('token');
window.location.href = '/login';
} else if (status === 403) {
console.error('没有权限');
} else if (status >= 500) {
console.error('服务器异常,请稍后重试');
}
return Promise.reject(error);
},
);
五、面试高频问答
Q1:401 和 403 的区别是什么?
401:未认证,通常需要登录403:已认证但无权限
Q2:为什么删除接口常返回 204?
删除成功后通常不需要返回额外数据,用 204 可以减少响应体开销。
Q3:304 是错误吗?
不是。304 是缓存协商成功的表现,说明资源未变更,属于性能优化的一部分。
Q4:500、502、503、504 应该如何区分?
500:应用自身异常502:网关拿到上游无效响应503:服务临时不可用504:网关等待上游超时
六、快速记忆表
| 状态码 | 含义 | 前端处理建议 |
|---|---|---|
| 200 | 成功 | 正常渲染 |
| 201 | 创建成功 | 可跳转到新资源 |
| 204 | 成功无响应体 | 不要解析 JSON |
| 301/302/307/308 | 重定向 | 跟随 Location |
| 304 | 缓存可用 | 使用本地缓存 |
| 400 | 请求有误 | 提示用户修正输入 |
| 401 | 未认证 | 跳转登录 |
| 403 | 无权限 | 展示权限不足 |
| 404 | 资源不存在 | 空状态/404 页面 |
| 409 | 资源冲突 | 提示冲突并刷新数据 |
| 422 | 业务校验失败 | 展示字段级错误 |
| 429 | 请求过多 | 延迟重试 |
| 500 | 服务器错误 | 通用错误提示 |
| 502/503/504 | 网关/服务异常 | 友好提示 + 重试策略 |