HTTP 状态码(HTTP Status Code)是服务器对客户端请求处理结果的标准化反馈,由3 位数字组成。首位数字定义了状态码所属的大类,后两位用于细分具体语义。
核心作用
- 明确请求是否成功
- 判断问题来源(客户端 / 服务器)
- 指导客户端下一步行为(重试、跳转、修正请求等)
一句话总览
- 1XX:还在处理(协议层交互)
- 2XX:成功(不同语义的成功结果)
- 3XX:需要跳转(资源位置变更)
- 4XX:客户端错(服务器拒绝请求)
- 5XX:服务器错(请求合法但服务异常)
一、HTTP 状态码整体分类
| 分类 | 含义 |
|---|---|
| 1XX | 信息性状态(处理中) |
| 2XX | 成功 |
| 3XX | 重定向 |
| 4XX | 客户端错误 |
| 5XX | 服务器错误 |
二、1XX 信息性状态码(请求正在处理中)
仅用于协议层交互,不代表请求完成
浏览器与普通业务代码几乎感知不到
100 Continue(继续)
说明:服务器已收到请求头,允许客户端继续发送请求体。
典型场景:
- 大文件上传
- POST 提交大量数据
- 请求头包含
Expect: 100-continue
客户端行为:继续发送请求体;若请求已完成,可忽略该响应。
101 Switching Protocols(切换协议)
说明:服务器同意切换通信协议。
典型场景:
- HTTP → WebSocket
- HTTP/1.1 → HTTP/2
102 Processing(处理中,WebDAV)
说明:服务器已接收请求并开始处理,但尚未完成。
场景:
- WebDAV 大文件操作
- 批量远程文件处理
三、2XX 成功状态码(重点)
不同 2XX 状态码代表“成功的不同语义”
不应只使用 200
200 OK(请求成功)
- 请求成功
- 返回完整响应体
- 最通用的成功状态码
常见场景:网页访问、接口查询、文件下载
201 Created(资源创建成功)
说明:请求成功,并新建了资源
特征:
- 通常返回
Location响应头 - REST API 中非常重要
POST /users → 201 Created Location: /users/123202 Accepted(请求已接受,尚未处理完成)
说明:请求合法,但处理将在后台异步执行。
典型场景:
- 批量任务
- 消息投递
- 异步计算
注意: - 不保证最终成功
- 不返回处理结果
203 Non-Authoritative Information(非权威信息)
- 返回结果经过代理修改
- 实际项目中极少使用
204 No Content(成功但无返回内容)
说明:
- 请求成功
- 响应体为空
- 不改变当前页面状态
典型场景: - DELETE 删除
- PUT 更新
- 心跳接口
205 Reset Content(重置内容)
- 请求成功
- 提示客户端重置当前视图
- 浏览器支持有限,实际使用极少
206 Partial Content(部分内容)
说明:服务器返回资源的一部分。
前提:请求头包含Range
典型场景:
- 断点续传
- 视频 / 音频分段加载
Range: bytes=0-1023 → 206 Partial Content✅ 2XX 使用建议
| 场景 | 推荐状态码 |
|---|---|
| 查询成功 | 200 |
| 创建资源 | 201 |
| 异步任务 | 202 |
| 删除成功 | 204 |
| 分段下载 | 206 |
四、3XX 重定向状态码
表示资源位置发生变化
客户端需重新请求
300 Multiple Choices(多种选择)
- 资源存在多个版本
- 浏览器通常自动选择
- 实际使用较少
301 Moved Permanently(永久重定向)
- 资源永久迁移
- 浏览器会缓存重定向关系
- SEO 场景常用
302 Found(临时重定向,HTTP/1.0)
- 临时跳转
- 可能将 POST 改为 GET
307 Temporary Redirect(临时重定向,HTTP/1.1)
- 保留请求方法
- 比 302 更安全
⭐ 308 Permanent Redirect(永久重定向,保留方法)
- 类似 301
- 强制保留原请求方法
- 更适合 API / REST 场景
304 Not Modified(未修改)
说明:
- 资源未发生变化
- 使用本地缓存
前提: - 请求头包含
If-Modified-Since - 请求头包含
If-None-Match
五、4XX 客户端错误状态码(重点)
4XX 的本质是:
服务器拒绝当前请求
1️⃣ 请求格式 / 内容错误
400 Bad Request
- 参数格式错误
- JSON 解析失败
- 请求体不合法
👉最常见接口错误
415 Unsupported Media Type
- Content-Type 不被支持
- 前后端联调高频错误
422 Unprocessable Entity(非常重要)
- 语法正确
- 业务校验失败
示例:
{"email":"invalid-email"}👉 比 400 更“语义正确”,强烈推荐在 REST API 中使用
2️⃣ 身份 & 权限问题
401 Unauthorized
- 未登录 / Token 无效
- 需要重新认证
403 Forbidden
- 已登录
- 但无权限
3️⃣ 资源相关错误
404 Not Found
- 资源不存在
- 接口路径错误
- ID 不存在
410 Gone(资源永久删除)
- 与 404 不同
- 明确表示:永远不会再有
👉 SEO / 资源下线非常有价值
4️⃣ 请求方式错误
405 Method Not Allowed
- 方法不被资源支持
- 通常返回
Allow头
5️⃣ 请求频率 & 并发限制
408 Request Timeout
- 客户端请求未完整发送
429 Too Many Requests(非常重要)
- 请求过于频繁
- 限流核心状态码
Retry-After: 60✅ 常见 4XX 状态码速记
| 状态码 | 含义 |
|---|---|
| 400 | 参数错误 |
| 401 | 未认证 |
| 403 | 无权限 |
| 404 | 不存在 |
| 405 | 方法不支持 |
| 415 | 媒体类型错误 |
| 422 | 业务校验失败 |
| 429 | 被限流 |
六、5XX 服务器错误状态码
请求是合法的
错误发生在服务器端
500 Internal Server Error
- 代码 / 配置 / 运行异常(后端代码异常、数据库错误、配置错误)
- 万能兜底,但不应滥用
501 Not Implemented
- 服务器不支持该请求方法
- 功能尚未实现
502 Bad Gateway
- 网关收到了上游无效响应
- 上游服务宕机 / 异常
503 Service Unavailable
- 服务器暂时不可用(维护 / 过载)
- 可恢复
- 通常可重试
504 Gateway Timeout
- 网关等不到上游响应
- 上游服务响应超时
七、如何根据 HTTP 状态码进行错误排查(实战重点)
1️⃣ 快速判断原则(开发者排查思路核心)
2XX → 正常流程 3XX → 检查跳转逻辑 4XX → 优先检查客户端 5XX → 优先检查服务器2️⃣ 客户端 / 前端处理策略
| 状态码 | 建议处理 |
|---|---|
| 200 | 正常渲染 |
| 201 | 记录资源地址 |
| 204 | 不刷新页面 |
| 401 | 跳转登录 |
| 403 | 提示无权限 |
| 404 | 空态 / 404 页面 |
| 429 | 延迟重试 |
| 5XX | 提示稍后重试 |
3️⃣ 后端接口设计建议(非常重要)
❌ 不要所有错误都返回 200
❌ 不要用 500 表示业务校验失败
✅ 语义正确比“省事”重要
推荐设计:
| 场景 | 状态码 |
|---|---|
| 参数错误 | 400 / 422 |
| 未登录 | 401 |
| 无权限 | 403 |
| 不存在 | 404 |
| 冲突 | 409 |
| 限流 | 429 |
| 服务异常 | 5XX |
4️⃣ 运维 / 网关排查方向
| 状态码 | 优先排查 |
|---|---|
| 500 | 应用日志 |
| 502 | 上游服务 |
| 503 | 服务负载 |
| 504 | 超时配置 |
八、终极总结(面试 & 实战版)
状态码本质
HTTP 状态码 = 请求结果 + 问题归属
- 4XX:你(客户端)的问题
- 5XX:我(服务器)的问题
必背高频状态码
200 成功 201 创建 301 永久重定向 302 临时重定向 401 未登录 403 无权限 404 不存在 429 限流 500 服务器错误 503 服务不可用👋 关注我!持续分享 C# 实战技巧、代码示例 & 技术干货