HTTP状态码详解
状态码分类体系
HTTP状态码由三位数字组成,第一位数字表示响应类别:
- 1xx:信息性状态码(Informational)
- 2xx:成功状态码(Success)
- 3xx:重定向状态码(Redirection)
- 4xx:客户端错误状态码(Client Error)
- 5xx:服务器错误状态码(Server Error)
1xx 信息性状态码
100 Continue
含义:客户端应继续请求。服务器已收到请求头,客户端应发送请求体。
使用场景:
- 客户端发送大文件前,先发送请求头
- 服务器检查请求头后,返回100 Continue,客户端再发送请求体
- 如果服务器拒绝,返回其他状态码(如413 Payload Too Large)
面试要点:
- 主要用于优化大文件上传
- 客户端需要发送
Expect: 100-continue请求头 - 不是所有服务器都支持,需要检查服务器能力
101 Switching Protocols
含义:服务器根据客户端请求切换协议(如从HTTP升级到WebSocket)。
使用场景:
- HTTP升级到WebSocket
- HTTP/1.1升级到HTTP/2
面试要点:
- WebSocket握手时使用
- 需要客户端发送
Upgrade请求头
102 Processing(WebDAV)
含义:服务器已接收并正在处理请求,但尚未完成。
使用场景:WebDAV扩展,表示长时间运行的请求正在处理中。
2xx 成功状态码
200 OK
含义:请求成功。响应体包含请求的资源。
使用场景:
- GET请求成功返回资源
- POST请求成功创建资源
- PUT请求成功更新资源
面试要点:
- 最常用的成功状态码
- 不同HTTP方法返回200的含义可能不同
201 Created
含义:请求成功,并且服务器创建了新的资源。
使用场景:
- POST请求创建新资源
- PUT请求创建新资源(如果资源不存在)
面试要点:
- 通常响应头包含
Location字段,指向新创建的资源URL - RESTful API中,创建资源应返回201而不是200
202 Accepted
含义:服务器已接受请求,但尚未处理完成。
使用场景:
- 异步处理任务
- 批量操作请求
面试要点:
- 请求已被接受,但处理结果未知
- 可能需要轮询或WebSocket获取最终结果
204 No Content
含义:服务器成功处理请求,但不返回任何内容。
使用场景:
- DELETE请求成功删除资源
- PUT请求更新资源,不需要返回内容
- OPTIONS预检请求
面试要点:
- 响应体必须为空
- 浏览器不会更新页面内容
- 常用于RESTful API的更新/删除操作
206 Partial Content
含义:服务器成功处理了部分GET请求(范围请求)。
使用场景:
- 断点续传
- 视频/音频流式传输
- 大文件分块下载
面试要点:
- 需要
Range请求头指定字节范围 - 响应头包含
Content-Range表示实际返回的范围 - 用于实现下载管理器的断点续传功能
3xx 重定向状态码
301 Moved Permanently
含义:资源已永久移动到新位置。
使用场景:
- 网站域名变更
- URL结构重构
- SEO优化,将旧URL永久重定向到新URL
面试要点:
- 永久重定向:浏览器会缓存重定向,后续直接访问新URL
- 搜索引擎会更新索引
- 响应头包含
Location指向新URL - GET和HEAD请求会自动重定向,POST请求需要用户确认
302 Found(临时重定向)
含义:资源临时移动到新位置。
使用场景:
- 临时维护页面
- A/B测试
- 登录后跳转
面试要点:
- 临时重定向:浏览器不会缓存,每次都会请求原URL
- 搜索引擎不会更新索引
- 历史问题:HTTP/1.0中302要求保持原HTTP方法,但浏览器实现为GET,导致混乱
- 响应头包含
Location
303 See Other
含义:重定向到另一个URI,使用GET方法获取资源。
使用场景:
- POST请求后重定向到结果页面(防止重复提交)
面试要点:
- 强制使用GET方法:无论原请求是什么方法,重定向后都使用GET
- 用于POST-Redirect-GET模式,防止表单重复提交
304 Not Modified
含义:资源未修改,客户端可以使用缓存的版本。
使用场景:
- 条件请求(If-Modified-Since、If-None-Match)
- 浏览器缓存验证
面试要点:
- 不是重定向:虽然属于3xx,但实际是缓存相关
- 响应体为空,节省带宽
- 需要配合
ETag或Last-Modified使用 - 缓存验证流程:
- 客户端发送
If-None-Match: "etag-value"或If-Modified-Since: date - 服务器比较,未修改返回304,修改返回200和新资源
- 客户端发送
307 Temporary Redirect
含义:临时重定向,必须保持原HTTP方法。
使用场景:
- 临时维护
- 负载均衡
面试要点:
- 保持原HTTP方法:POST重定向后仍是POST
- 与302的区别:302允许浏览器改变方法,307不允许
- HTTP/1.1引入,解决302的歧义
308 Permanent Redirect
含义:永久重定向,必须保持原HTTP方法。
使用场景:
- 永久URL变更,但需要保持HTTP方法
面试要点:
- 保持原HTTP方法:POST重定向后仍是POST
- 与301的区别:301允许浏览器改变方法,308不允许
- HTTP/1.1引入
重定向状态码对比
| 状态码 | 类型 | 保持方法 | 缓存 | 使用场景 |
|---|---|---|---|---|
| 301 | 永久 | 可能改变 | 是 | 域名变更、URL重构 |
| 302 | 临时 | 可能改变 | 否 | 临时跳转、登录后跳转 |
| 303 | 临时 | 强制GET | 否 | POST后跳转(防重复提交) |
| 307 | 临时 | 必须保持 | 否 | 临时维护、负载均衡 |
| 308 | 永久 | 必须保持 | 是 | 永久URL变更(保持方法) |
4xx 客户端错误状态码
400 Bad Request
含义:请求语法错误,服务器无法理解。
使用场景:
- 请求格式错误
- 参数缺失或格式不正确
- JSON格式错误
面试要点:
- 客户端问题,需要修改请求
- 常见原因:Content-Type不匹配、JSON语法错误、参数类型错误
401 Unauthorized
含义:请求需要身份验证。
使用场景:
- 未登录访问需要认证的资源
- Token过期或无效
面试要点:
- 认证(Authentication):你是谁?
- 响应头包含
WWW-Authenticate指示认证方式 - 与403的区别:401是未认证,403是已认证但无权限
403 Forbidden
含义:服务器理解请求,但拒绝执行(权限不足)。
使用场景:
- 已登录但无权限访问资源
- IP被禁止
- 文件系统权限不足
面试要点:
- 授权(Authorization):你能做什么?
- 与401的区别:401是未认证,403是已认证但无权限
- 即使提供正确的认证信息也无法访问
404 Not Found
含义:服务器找不到请求的资源。
使用场景:
- URL不存在
- 资源已删除
- 路由配置错误
面试要点:
- 最常用的错误状态码
- 与410的区别:404不知道资源是否存在,410明确知道资源已永久删除
- SEO考虑:404页面应提供友好的用户体验
405 Method Not Allowed
含义:请求方法不被允许。
使用场景:
- 对只读资源使用POST
- API不支持某个HTTP方法
面试要点:
- 响应头应包含
Allow列出允许的方法 - RESTful API中常见:资源只支持GET,但客户端发送了POST
408 Request Timeout
含义:请求超时。
使用场景:
- 客户端发送请求时间过长
- 服务器等待请求超时
面试要点:
- 客户端可以重试请求
- 与504的区别:408是服务器等待客户端请求超时,504是服务器处理超时
409 Conflict
含义:请求与服务器当前状态冲突。
使用场景:
- 并发更新冲突
- 资源版本冲突(乐观锁)
- 创建资源时已存在
面试要点:
- 常用于并发控制
- 响应体应包含冲突信息,帮助客户端解决冲突
410 Gone
含义:资源已永久删除,且不会再有。
使用场景:
- 资源明确已删除
- 与404的区别:明确知道资源曾经存在但已删除
面试要点:
- 客户端不应再请求该资源
- 搜索引擎会从索引中移除
- 比404更明确的信息
413 Payload Too Large
含义:请求体过大。
使用场景:
- 上传文件超过大小限制
- POST数据过大
面试要点:
- 服务器配置限制
- 客户端需要减小请求体或分块上传
414 URI Too Long
含义:请求URI过长。
使用场景:
- GET请求参数过多(应使用POST)
- URL编码后过长
面试要点:
- 通常GET请求参数应放在查询字符串,但过长应改用POST
- 浏览器和服务器都有URL长度限制
415 Unsupported Media Type
含义:服务器不支持请求的媒体类型。
使用场景:
- Content-Type不被支持
- 上传文件类型不允许
面试要点:
- 检查请求头的
Content-Type - 服务器应返回支持的媒体类型列表
429 Too Many Requests
含义:请求频率过高。
使用场景:
- API限流
- 防止DDoS攻击
面试要点:
- 响应头应包含
Retry-After指示重试时间 - 常用于API限流策略
431 Request Header Fields Too Large
含义:请求头字段过大。
使用场景:
- Cookie过多
- 自定义请求头过大
面试要点:
- 服务器配置限制
- 需要减少请求头大小
5xx 服务器错误状态码
500 Internal Server Error
含义:服务器内部错误。
使用场景:
- 服务器代码异常
- 数据库连接失败
- 未捕获的异常
面试要点:
- 服务器问题,客户端无法解决
- 应记录详细错误日志便于排查
- 不应向客户端暴露敏感错误信息
501 Not Implemented
含义:服务器不支持请求的功能。
使用场景:
- HTTP方法未实现
- 功能未开发
面试要点:
- 与405的区别:501是功能未实现,405是方法不被允许
- 服务器未来可能支持
502 Bad Gateway
含义:网关或代理服务器从上游服务器收到无效响应。
使用场景:
- 反向代理无法从后端服务器获取有效响应
- 上游服务器崩溃
- 网络问题
面试要点:
- 网关/代理服务器问题
- 常见于Nginx等反向代理服务器
- 与504的区别:502是上游服务器响应无效,504是上游服务器响应超时
503 Service Unavailable
含义:服务器暂时无法处理请求(过载或维护)。
使用场景:
- 服务器过载
- 维护模式
- 临时不可用
面试要点:
- 临时状态:服务器稍后可能恢复
- 响应头应包含
Retry-After指示重试时间 - 客户端可以稍后重试
504 Gateway Timeout
含义:网关或代理服务器等待上游服务器响应超时。
使用场景:
- 上游服务器处理时间过长
- 网络延迟
面试要点:
- 网关/代理服务器问题
- 与408的区别:504是服务器等待上游响应超时,408是服务器等待客户端请求超时
- 常见于微服务架构中的服务调用超时
505 HTTP Version Not Supported
含义:服务器不支持请求使用的HTTP版本。
使用场景:
- 客户端使用HTTP/2,但服务器只支持HTTP/1.1
- 版本不匹配
面试要点:
- 版本兼容性问题
- 服务器应返回支持的HTTP版本
状态码选择最佳实践
RESTful API设计
- GET:200(成功)、404(不存在)
- POST:201(创建成功)、200(其他成功操作)
- PUT:200(更新成功)、201(创建成功)、204(无内容返回)
- DELETE:204(删除成功)、200(删除成功并返回内容)
- PATCH:200(更新成功)、204(无内容返回)
错误处理原则
-
4xx vs 5xx:
- 4xx:客户端问题,需要修改请求
- 5xx:服务器问题,客户端无法解决
-
错误信息:
- 4xx:可以提供详细错误信息帮助客户端修正
- 5xx:不应暴露敏感信息,但应记录详细日志
-
幂等性:
- 4xx错误:可以重试(修改请求后)
- 5xx错误:可以重试(相同请求)
- 网络错误:可以重试
面试高频问题
- 301和302的区别?什么时候用哪个?
- 304状态码的作用?如何实现缓存验证?
- 401和403的区别?
- 404和410的区别?
- 502、503、504的区别?
- POST请求返回302会怎样?如何避免?
- HTTP状态码如何选择?RESTful API设计原则?
- 如何处理5xx错误?重试策略?