HTTP 状态码分类整理(含协议说明版)
HTTP 状态码是服务器对客户端请求的响应状态标识,共分为 5 大类(1xx-5xx),核心遵循「分类明确、场景具象、协议关联、易记实用」原则整理,适合开发调试、接口对接、面试备考等场景。
核心分类逻辑
1xx:信息提示 → 请求已接收,需继续处理(少见,多关联HTTP/1.1及以上协议)
2xx:成功响应 → 请求已被正常处理(适配HTTP全协议版本、WebSocket握手后确认等)
3xx:重定向 → 需客户端进一步操作才能完成请求(主要关联HTTP/1.0及以上协议,WebSocket无此场景)
4xx:客户端错误 → 请求存在语法错误或无法被服务器处理(客户端问题,适配HTTP全协议、WebSocket握手阶段等)
5xx:服务器错误 → 服务器处理请求时发生内部错误(服务器问题,适配HTTP全协议、WebSocket握手阶段等)
一、1xx 信息状态码(临时响应)
用于告知客户端「请求已收到,正在处理」,通常由服务器内部使用,客户端无需手动处理,主要关联 HTTP/1.1 及以上协议(HTTP/1.0 不支持1xx状态码)。
| 状态码 | 名称 | 核心含义 | 关联协议 | 应用场景 |
|---|---|---|---|---|
| 100 | Continue(继续) | 服务器已接收请求头,客户端可发送请求体 | HTTP/1.1、WebSocket(握手前置) | 1. 大文件上传、分块请求(如 POST 大表单);2. WebSocket 握手时,客户端发送带 Upgrade 头的请求后,服务器返回100表示已接收请求头,允许客户端继续完成握手流程 |
| 101 | Switching Protocols(协议切换) | 服务器同意客户端切换协议 | HTTP/1.1、WebSocket(核心握手响应) | 最典型场景为 WebSocket 协议切换:客户端发送 HTTP 请求并携带 Upgrade: websocket 头,服务器返回101表示同意切换至 WebSocket 协议,后续通信使用 WebSocket 协议而非 HTTP |
| 102 | Processing(处理中) | 服务器正在处理请求,需等待 | HTTP/1.1、WebDAV 扩展协议 | WebDAV 协议下的复杂文件操作(如批量上传、文件夹创建),告知客户端服务器仍在处理,避免客户端超时重试 |
二、2xx 成功状态码(请求处理完成)
核心标识「客户端请求合法,服务器已正常响应」,是开发中最理想的响应状态,适配 HTTP 全协议版本、WebSocket 握手后确认(部分场景) 等。
| 状态码 | 名称 | 核心含义 | 关联协议 | 应用场景 |
|---|---|---|---|---|
| 200 | OK(成功) | 请求完全成功,响应体包含所需数据 | HTTP/1.0 及以上、HTTP/2、HTTP/3 | 绝大多数 GET/POST 请求(如查询数据、提交表单成功);HTTP 协议下的接口调用成功的默认返回状态 |
| 201 | Created(已创建) | 请求成功且服务器创建了新资源 | HTTP/1.0 及以上、RESTful API 规范 | POST 新增资源(如创建用户、新增订单);RESTful 协议规范中,新增资源必须返回201,且响应头携带 Location 指向新资源地址 |
| 202 | Accepted(已接受) | 请求已接收,但尚未处理完成(异步处理) | HTTP/1.1 及以上、异步 API 协议 | 耗时操作(如批量导出数据、异步任务提交);常见于微服务架构中,服务接收请求后转发至异步队列,返回202告知客户端「已受理,后续需自行查询结果」 |
| 204 | No Content(无内容) | 请求成功,但响应体无数据 | HTTP/1.0 及以上、RESTful API 规范 | DELETE 请求(删除资源成功)、PUT 更新资源(无需返回内容);RESTful 协议中,删除资源成功且无需返回信息时用204,避免返回空响应体浪费带宽 |
| 206 | Partial Content(部分内容) | 客户端请求部分资源,服务器成功返回 | HTTP/1.1 及以上、HTTP 范围请求协议 | 断点续传、大文件分片下载(如视频分段加载、迅雷等下载工具的多线程下载);客户端通过 Range 头指定资源范围,服务器返回对应部分内容并携带206状态码 |
三、3xx 重定向状态码(需客户端进一步操作)
服务器无法直接返回目标资源,需客户端通过新地址或调整请求方式继续访问,核心是「资源位置变更或需验证」,主要关联 HTTP/1.0 及以上协议(WebSocket 建立连接后无重定向场景)。
| 状态码 | 名称 | 核心含义 | 关联协议 | 应用场景 | 注意点 |
|---|---|---|---|---|---|
| 301 | Moved Permanently(永久重定向) | 资源已永久迁移到新地址 | HTTP/1.0 及以上、HTTP 重定向协议 | 网站域名更换(如 old.com 迁移到 new.com)、页面路径调整(如 /v1/user 迁移到 /v2/user) | 客户端下次应直接访问新地址(浏览器会缓存重定向关系,需通过 Ctrl+F5 强制刷新清除缓存) |
| 302 | Found(临时重定向) | 资源临时迁移到新地址 | HTTP/1.0 及以上、HTTP 重定向协议 | 网站临时维护页面(访问首页跳转到 /maintain.html)、登录后跳转(如未登录访问 /user 跳转到 /login) | 客户端下次仍需访问原地址(不缓存重定向关系,每次请求都会经过原地址判断) |
| 303 | See Other(查看其他地址) | 需通过 GET 方式访问新地址 | HTTP/1.1 及以上、HTTP 重定向协议 | POST 提交成功后跳转(如表单提交后跳转到结果页,避免刷新表单重复提交)、支付后跳转(支付成功后从 POST 接口跳转到订单详情页) | 强制将原请求方法转为 GET 请求(即使原请求是 POST,跳转后也会用 GET 访问新地址) |
| 304 | Not Modified(未修改) | 资源未变更,可使用本地缓存 | HTTP/1.1 及以上、HTTP 缓存协议(强缓存+协商缓存) | 静态资源(JS/CSS/图片)缓存优化;客户端首次请求后缓存资源,再次请求时携带 If-Modified-Since 等头,服务器判断资源未更新则返回304 |
响应体无内容,仅通过响应头告知缓存可用,大幅减少带宽消耗 |
| 307 | Temporary Redirect(临时重定向,不改变方法) | 临时重定向,保留原请求方法 | HTTP/1.1 及以上、HTTP 重定向协议 | API 临时迁移(如 /api/user 临时迁移到 /api/v1/user,且需保持 POST/PUT 等非 GET 方法) | 与 302 区别:302 可能将 POST 转为 GET,307 严格保留原请求方法(适合 API 接口重定向) |
| 308 | Permanent Redirect(永久重定向,不改变方法) | 永久重定向,保留原请求方法 | HTTP/1.1 及以上、HTTP 重定向协议 | API 永久迁移(如 /api/order 永久迁移到 /api/v2/order,且需保持 POST 提交订单的方法) | 与 301 区别:301 可能将 POST 转为 GET,308 严格保留原请求方法(适合 RESTful API 永久迁移) |
四、4xx 客户端错误状态码(客户端请求有误)
核心是「客户端请求存在问题,服务器无法处理」,需客户端修正请求后重新发送,适配 HTTP 全协议版本、WebSocket 握手阶段 等。
| 状态码 | 名称 | 核心含义 | 关联协议 | 常见原因 | 排查方向 |
|---|---|---|---|---|---|
| 400 | Bad Request(请求错误) | 请求语法错误或参数不合法 | HTTP 全协议版本、WebSocket 握手阶段、RESTful API 规范 | 1. HTTP 场景:JSON 格式错误、必填参数缺失、参数类型错误;2. WebSocket 场景:握手请求中 Upgrade 头格式错误或缺失 | 检查请求体格式(如 JSON 引号是否闭合)、参数是否符合接口文档;WebSocket 场景检查握手请求头是否规范 |
| 401 | Unauthorized(未授权) | 请求需身份验证(未登录或令牌失效) | HTTP 全协议版本、OAuth 2.0 协议、JWT 认证协议、WebSocket 握手认证 | 1. HTTP 场景:未传 Token、Token 过期、Token 伪造;2. WebSocket 场景:握手请求中未携带认证 Token 或 Token 无效 | 检查登录状态、Token 有效性(如 JWT Token 签名是否正确、过期时间是否有效);WebSocket 场景确认认证参数是否在握手头中携带 |
| 403 | Forbidden(禁止访问) | 已登录,但无权限访问资源 | HTTP 全协议版本、RBAC 权限协议、IP 黑白名单协议 | 角色权限不足(普通用户访问管理员接口 /admin/user)、IP 被封禁(非法 IP 访问网站)、资源私有(未授权访问他人隐私数据) | 检查用户角色权限配置(如 RBAC 权限表中是否有对应接口权限)、服务器 IP 黑白名单配置 |
| 404 | Not Found(未找到) | 请求的资源不存在 | HTTP 全协议版本、WebSocket 握手阶段(路径错误) | 1. HTTP 场景:路径错误(如 /usre 拼写错误为 /user)、资源已删除、域名配置错误;2. WebSocket 场景:握手路径错误(如 /ws 写成 /wss) | 检查 URL 路径拼写、资源是否存在、Nginx 路由配置(如 proxy_pass 地址是否正确);WebSocket 场景确认路径是否在服务器端注册 |
| 405 | Method Not Allowed(方法不允许) | 请求方法(GET/POST 等)不支持 | HTTP 全协议版本、RESTful API 规范 | 用 POST 访问仅支持 GET 的接口(如 /api/user 仅支持 GET 查询,却用 POST 请求)、用 PUT 访问仅支持 DELETE 的接口 | 检查接口支持的请求方法(参考接口文档),响应头 Allow 会显示支持的方法(如 Allow: GET, HEAD) |
| 406 | Not Acceptable(无法接受) | 客户端要求的响应格式服务器无法提供 | HTTP/1.1 及以上、内容协商协议 | 客户端请求头 Accept 要求返回 XML 格式(Accept: application/xml),但服务器仅支持 JSON 格式;客户端要求返回特定编码(Accept-Charset: GBK),服务器仅支持 UTF-8 |
检查请求头 Accept 字段与服务器响应格式是否匹配,服务器端是否配置了对应的内容协商规则 |
| 408 | Request Timeout(请求超时) | 客户端请求发送超时 | HTTP 全协议版本、TCP 协议(连接超时) | 网络波动导致请求传输中断、请求体过大导致发送耗时超过服务器超时时间、服务器处理过慢导致客户端等待超时 | 优化网络环境、拆分大请求(如将 10MB 表单拆分为多个小请求)、检查服务器处理耗时(如 SQL 执行时间) |
| 409 | Conflict(冲突) | 请求与服务器资源状态冲突 | HTTP/1.1 及以上、RESTful API 规范、并发控制协议 | 新增重复数据(如用户名已存在)、并发修改同一资源(两个用户同时修改同一条订单状态)、资源版本冲突(乐观锁场景下版本号不匹配) | 检查资源唯一性约束(如数据库唯一索引)、处理并发冲突(如使用乐观锁 version 字段、分布式锁) |
| 413 | Payload Too Large(请求体过大) | 请求体超过服务器限制 | HTTP/1.1 及以上、服务器配置协议(如 Nginx、Tomcat) | 上传大文件(如超过 Nginx 配置的 100MB 限制)、提交过多表单数据(如批量提交 10000 条数据) | 拆分请求(如文件分片上传)、压缩文件、调整服务器最大请求体限制(如 Nginx client_max_body_size、Tomcat maxPostSize) |
| 415 | Unsupported Media Type(不支持的媒体类型) | 请求体格式服务器不支持 | HTTP/1.1 及以上、内容类型协议(Content-Type) | 1. 上传非允许的文件格式(如服务器仅允许上传图片,却上传视频);2. 请求体编码错误(如 Content-Type: application/json 却传表单数据);3. WebSocket 场景:握手请求 Content-Type 错误 | 检查请求头 Content-Type 字段是否正确、服务器支持的文件类型配置(如上传接口的白名单) |
| 429 | Too Many Requests(请求过多) | 客户端短期内请求频率过高 | HTTP/1.1 及以上、限流协议(如令牌桶、漏桶算法) | 未做限流的客户端高频调用接口(如每秒调用 100 次)、爬虫无限制爬取网站数据、恶意攻击导致请求量突增 | 优化请求频率(如加本地缓存减少请求)、遵循服务器限流规则(响应头 Retry-After 会告知多久后可重试)、客户端实现退避重试机制 |
五、5xx 服务器错误状态码(服务器处理异常)
核心是「客户端请求合法,但服务器内部出现错误」,需服务器端排查问题,适配 HTTP 全协议版本、WebSocket 握手阶段(服务器异常) 等。
| 状态码 | 名称 | 核心含义 | 关联协议 | 常见原因 | 排查方向 |
|---|---|---|---|---|---|
| 500 | Internal Server Error(内部服务器错误) | 服务器未知异常 | HTTP 全协议版本、WebSocket 握手阶段(服务器代码异常) | 1. HTTP 场景:代码 Bug(空指针、数组越界)、配置错误(如数据库连接信息错误)、依赖服务宕机(如调用 Redis 时 Redis 未启动);2. WebSocket 场景:握手处理代码抛出异常 | 查看服务器日志(如 Tomcat catalina.out、Spring Boot 日志)、排查代码逻辑(如异常捕获是否完整)、检查依赖服务状态(如 Redis、MySQL 是否正常运行) |
| 501 | Not Implemented(未实现) | 服务器不支持该请求功能 | HTTP 全协议版本、协议兼容性协议 | 访问未开发完成的接口(如 /api/payment 尚未实现)、使用服务器不支持的 HTTP 方法(如 TRACE、OPTIONS 方法未开启)、客户端使用 HTTP/3 但服务器仅支持 HTTP/1.1 | 检查接口是否已上线(参考接口开发进度)、HTTP 方法是否在服务器端开启(如 Nginx 配置是否允许 OPTIONS 方法)、服务器支持的 HTTP 版本(如是否升级到 HTTP/3) |
| 502 | Bad Gateway(网关错误) | 网关(如 Nginx)无法连接后端服务器 | HTTP 全协议版本、网关协议(如 Nginx、Apache 网关) | 后端服务宕机(如 Tomcat 停止运行)、端口占用(后端服务端口被其他程序占用)、网络不通(网关与后端服务之间网络中断)、后端服务返回无效响应 | 检查后端服务状态(如 `ps -ef |
| 503 | Service Unavailable(服务不可用) | 服务器暂时无法处理请求(过载或维护) | HTTP/1.1 及以上、服务治理协议(如服务熔断、降级) | 服务器高负载(CPU 占满 100%、内存溢出)、服务维护中(如部署新版本时停止服务)、微服务熔断(如 Hystrix 触发熔断机制关闭服务) | 检查服务器资源使用情况(如 top 命令查看 CPU/内存)、查看服务是否在维护(如部署工具日志)、检查服务治理配置(如 Hystrix 熔断阈值是否合理) |
| 504 | Gateway Timeout(网关超时) | 网关等待后端服务器响应超时 | HTTP 全协议版本、网关协议(如 Nginx、Apache 网关) | 后端服务处理过慢(如复杂 SQL 执行耗时超过网关超时时间)、网络延迟(网关与后端服务之间网络延迟过高)、后端服务线程池满(无法处理新请求) | 优化后端接口性能(如 SQL 优化、加缓存减少数据库查询)、调整网关超时时间(如 Nginx proxy_connect_timeout、proxy_read_timeout)、扩大后端服务线程池配置 |
| 505 | HTTP Version Not Supported(HTTP 版本不支持) | 服务器不支持客户端使用的 HTTP 版本 | HTTP 版本协议(HTTP/1.0、HTTP/1.1、HTTP/2、HTTP/3) | 客户端使用 HTTP/3 发送请求,但服务器仅支持 HTTP/1.1;客户端使用 HTTP/1.1 的 Pipeline 特性,但服务器未开启该特性 | 检查客户端使用的 HTTP 版本(如浏览器 F12 Network 面板查看)、服务器支持的 HTTP 版本(如 Nginx 配置 http_protocol、Tomcat 支持的版本) |
| 507 | Insufficient Storage(存储不足) | 服务器存储空间不足 | HTTP/1.1 及以上、文件存储协议 | 服务器磁盘满(如 / 分区使用率 100%)、上传文件过多未清理(如用户上传文件占满存储目录)、数据库表空间满(如 MySQL 表空间达到上限) | 检查服务器磁盘空间(如 df -h 命令)、清理无用文件(如日志文件、过期上传文件)、扩展磁盘容量或数据库表空间 |
六、开发必备高频状态码速记(含协议关联)
| 类别 | 高频状态码 | 核心场景+协议总结 |
|---|---|---|
| 成功 | 200、201、204 | 200=HTTP 全协议查询/提交成功;201=RESTful 协议新增资源成功;204=RESTful 协议删除/更新无返回成功 |
| 重定向 | 301、302、304 | 301=HTTP 重定向协议永久迁移;302=HTTP 重定向协议临时跳转;304=HTTP 缓存协议缓存命中 |
| 客户端错误 | 400、401、403、404、429 | 400=全协议请求参数错;401=OAuth/JWT 协议未授权;403=RBAC 协议无权限;404=全协议资源不存在;429=限流协议请求太频繁 |
| 服务器错误 | 500、502、503、504 | 500=全协议代码 Bug;502=网关协议后端宕机;503=服务治理协议服务过载;504=网关协议后端超时 |
| 协议切换 | 101 | 101=HTTP/1.1 协议切换为 WebSocket 协议(实时通信核心) |
七、实用排查技巧(结合协议场景)
4xx 错误:优先检查请求 URL、参数、请求头(Content-Type/Accept/Upgrade);涉及认证的 401 需确认认证协议(如 JWT、OAuth)的 Token 有效性;WebSocket 握手阶段的 4xx 需重点检查握手头格式和认证信息。
5xx 错误:优先查看服务器日志(应用日志、网关日志);502/504 需重点检查网关协议配置(如 Nginx proxy 相关参数);503 需检查服务治理协议(如熔断、降级)配置和服务器资源。
重定向问题:通过浏览器 F12 「Network」查看「Location」响应头确认新地址;301/308 永久重定向需注意缓存问题,302/307 临时重定向需确认是否保留原请求方法。
缓存问题:304 错误时,检查客户端是否携带 HTTP 缓存协议的标识(If-Modified-Since/If-None-Match),服务器是否正确判断资源更新状态;静态资源缓存需结合 Cache-Control 头配置。
WebSocket 相关:握手阶段的 100/101 是正常流程,出现 400/401/500 需分别排查握手头格式、认证信息、服务器代码;建立连接后无状态码,通信异常需查帧协议(如数据帧格式错误)。
这份文档补充了各状态码对应的核心关联协议,更贴合实际开发中不同协议场景的使用需求。
我是周伟,专注于Java和架构领域,坚持撰写有原理,有实战,有体系的技术文章。