未找到匹配的笔记

HTTP状态码详解

浏览器网络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,但实际是缓存相关
  • 响应体为空,节省带宽
  • 需要配合 ETagLast-Modified 使用
  • 缓存验证流程
    1. 客户端发送 If-None-Match: "etag-value"If-Modified-Since: date
    2. 服务器比较,未修改返回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临时强制GETPOST后跳转(防重复提交)
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(无内容返回)

错误处理原则

  1. 4xx vs 5xx

    • 4xx:客户端问题,需要修改请求
    • 5xx:服务器问题,客户端无法解决
  2. 错误信息

    • 4xx:可以提供详细错误信息帮助客户端修正
    • 5xx:不应暴露敏感信息,但应记录详细日志
  3. 幂等性

    • 4xx错误:可以重试(修改请求后)
    • 5xx错误:可以重试(相同请求)
    • 网络错误:可以重试

面试高频问题

  1. 301和302的区别?什么时候用哪个?
  2. 304状态码的作用?如何实现缓存验证?
  3. 401和403的区别?
  4. 404和410的区别?
  5. 502、503、504的区别?
  6. POST请求返回302会怎样?如何避免?
  7. HTTP状态码如何选择?RESTful API设计原则?
  8. 如何处理5xx错误?重试策略?