【架构】-- HTTP 响应状态码详解

HTTP 响应状态码详解

目录

HTTP 响应状态码详解

概述

状态码分类总览

信息响应 (100-199)

成功响应 (200-299)

重定向消息 (300-399)

重定向状态码对比

客户端错误响应 (400-499)

常见客户端错误对比

服务端错误响应 (500-599)

常见服务端错误对比

状态码快速参考表

最常用的状态码

按 HTTP 方法推荐的状态码

最佳实践

1. 状态码选择指南

2. 错误响应格式建议

3. 缓存策略

4. 安全最佳实践

5. RESTful API 设计规范

6. 常见错误处理模式

参考资料


概述

HTTP 响应状态码用来表明特定 HTTP 请求是否成功完成。状态码是 HTTP 协议的重要组成部分,帮助客户端理解服务器对请求的处理结果。

重要提示: 如果你收到的响应不在标准列表中,则它为非标准响应,可能是服务器软件的自定义响应。

状态码分类总览

HTTP 响应状态码被归为以下五大类:

类别范围说明常见状态码
信息响应100-199临时响应,表示请求已接收,继续处理100, 101, 102, 103
成功响应200-299请求已成功处理200, 201, 202, 204, 206
重定向消息300-399需要进一步操作以完成请求301, 302, 303, 304, 307, 308
客户端错误响应400-499请求包含错误语法或无法完成400, 401, 403, 404, 405, 429
服务端错误响应500-599服务器处理请求时发生错误500, 502, 503, 504

信息响应 (100-199)

信息响应状态码表示请求已接收,客户端应继续处理。

状态码名称含义使用场景状态
100Continue这个临时响应表明,迄今为止的所有内容都是可行的,客户端应该继续请求,如果已经完成,则忽略它客户端发送带有 Expect: 100-continue 头的请求时,服务器会先返回此状态码,表示可以继续发送请求体✅ 标准
101Switching Protocols该代码是响应客户端的 Upgrade 请求头发送的,指明服务器即将切换的协议用于协议升级,例如从 HTTP/1.1 升级到 WebSocket✅ 标准
102Processing (WebDAV)此代码表示服务器已收到并正在处理该请求,但当前没有响应可用主要用于 WebDAV 扩展,表示请求正在处理中,可以防止客户端超时✅ WebDAV
103Early Hints此状态代码主要用于与 Link 链接头一起使用,以允许用户代理在服务器准备响应阶段时开始预加载资源用于性能优化,允许浏览器提前开始加载资源✅ 标准

成功响应 (200-299)

成功响应状态码表示请求已成功处理。

状态码名称含义使用场景HTTP 方法对应
200OK请求成功。成功的含义取决于 HTTP 方法: - GET: 资源已被提取并在消息正文中传输 - HEAD: 实体标头位于消息正文中 - PUTPOST: 描述动作结果的资源在消息体中传输 - TRACE: 消息正文包含服务器收到的请求消息最常用的成功状态码,适用于大多数成功的请求GET, HEAD, PUT, POST, TRACE
201Created该请求已成功,并因此创建了一个新的资源。这通常是在 POST 请求,或是某些 PUT 请求之后返回的响应创建新资源后返回,通常响应头中包含 Location 字段,指向新创建的资源POST, PUT
202Accepted请求已经接收到,但还未响应,没有结果。意味着不会有一个异步的响应去表明当前请求的结果,预期另外的进程和服务去处理请求,或者批处理异步处理场景、批量操作、需要长时间处理的任务POST, PUT, DELETE
203Non-Authoritative Information服务器已成功处理了请求,但返回的实体头部元信息不是在原始服务器上有效的确定集合,而是来自本地或者第三方的拷贝使用缓存或代理服务器时,当返回的信息可能不是最新版本时使用GET
204No Content对于该请求没有的内容可发送,但头部字段可能有用。用户代理可能会用此时请求头部信息来更新原来资源的头部缓存字段DELETE 请求成功但无需返回内容、更新操作成功但无需返回数据、表单提交后的成功响应DELETE, PUT, PATCH
205Reset Content告诉用户代理重置发送此请求的文档表单提交后,需要清空表单内容时使用POST
206Partial Content当从客户端发送 Range 范围标头以只请求资源的一部分时,将使用此响应代码断点续传、视频/音频流式传输、大文件分块下载GET
207Multi-Status (WebDAV)对于多个状态代码都可能合适的情况,传输有关多个资源的信息WebDAV 协议中,一次请求操作多个资源时使用PROPFIND, PROPPATCH
208Already Reported (WebDAV)在 DAV 里面使用 <dav:propstat> 响应元素以避免重复枚举多个绑定的内部成员到同一个集合WebDAV 协议专用PROPFIND
226IM Used (HTTP Delta encoding)服务器已经完成了对资源的 GET 请求,并且响应是对当前实例应用的一个或多个实例操作结果的表示HTTP Delta 编码场景GET

重定向消息 (300-399)

重定向状态码表示需要进一步操作以完成请求。

状态码名称含义使用场景是否保持方法缓存性状态
300Multiple Choice请求拥有多个可能的响应。用户代理或者用户应当从中选择一个内容协商场景,当服务器提供多个资源版本时-不缓存✅ 标准
301Moved Permanently请求资源的 URL 已永久更改。在响应中给出了新的 URL网站永久迁移、URL 结构重构、域名变更可能改变永久缓存✅ 标准
302Found此响应代码表示所请求资源的 URI 已暂时更改。未来可能会对 URI 进行进一步的改变临时重定向、维护期间的页面跳转可能改变不缓存✅ 标准
303See Other服务器发送此响应,以指示客户端通过一个 GET 请求在另一个 URI 中获取所请求的资源POST 请求后重定向到结果页面,避免重复提交改为 GET不缓存✅ 标准
304Not Modified这是用于缓存的目的。它告诉客户端响应还没有被修改,因此客户端可以继续使用相同的缓存版本的响应条件请求(If-Modified-Since, If-None-Match)、缓存验证、减少带宽使用-使用缓存✅ 标准
305Use Proxy在 HTTP 规范中定义,以指示请求的响应必须被代理访问。由于对代理的带内配置的安全考虑,它已被弃用---⚠️ 已弃用
306unused此响应代码不再使用;它只是保留。它曾在 HTTP/1.1 规范的早期版本中使用过---❌ 不再使用
307Temporary Redirect服务器发送此响应,以指示客户端使用在前一个请求中使用的相同方法在另一个 URI 上获取所请求的资源。与 302 Found 具有相同的语义,但用户代理不能更改所使用的 HTTP 方法临时重定向、需要保持 HTTP 方法不变的重定向必须保持不缓存✅ 标准
308Permanent Redirect这意味着资源现在永久位于由 Location: HTTP Response 标头指定的另一个 URI。与 301 Moved Permanently 具有相同的语义,但用户代理不能更改所使用的 HTTP 方法永久重定向、需要保持 HTTP 方法不变的永久重定向必须保持永久缓存✅ 标准

重定向状态码对比

特性301302303307308
永久/临时永久临时临时临时永久
保持 HTTP 方法可能改变可能改变改为 GET必须保持必须保持
缓存性永久缓存不缓存不缓存不缓存永久缓存
使用频率

客户端错误响应 (400-499)

客户端错误响应表示请求包含错误语法或无法完成。

状态码名称含义使用场景常见原因
400Bad Request由于被认为是客户端错误(例如,错误的请求语法、无效的请求消息帧或欺骗性的请求路由),服务器无法或不会处理请求请求格式错误、参数缺失或格式不正确、JSON 解析错误请求语法错误、参数错误
401Unauthorized虽然 HTTP 标准指定了"unauthorized",但从语义上来说,这个响应意味着"unauthenticated"。也就是说,客户端必须对自身进行身份验证才能获得请求的响应需要登录但未提供认证信息、认证信息无效或过期未认证、认证失败
402Payment Required此响应代码保留供将来使用。创建此代码的最初目的是将其用于数字支付系统,但是此状态代码很少使用,并且不存在标准约定--
403Forbidden客户端没有访问内容的权限;也就是说,它是未经授权的,因此服务器拒绝提供请求的资源。与 401 Unauthorized 不同,服务器知道客户端的身份已认证但权限不足、IP 地址被禁止、资源访问受限权限不足、访问被禁止
404Not Found服务器找不到请求的资源。在浏览器中,这意味着无法识别 URL。在 API 中,这也可能意味着端点有效,但资源本身不存在URL 不存在、资源已被删除、路由配置错误资源不存在、URL 错误
405Method Not Allowed服务器知道请求方法,但目标资源不支持该方法。例如,API 可能不允许调用 DELETE 来删除资源使用了不支持的 HTTP 方法、RESTful API 中方法不匹配HTTP 方法不支持
406Not Acceptable当 web 服务器在执行服务端驱动型内容协商机制后,没有发现任何符合用户代理给定标准的内容时,就会发送此响应内容协商失败、客户端请求的格式服务器无法提供内容格式不支持
407Proxy Authentication Required类似于 401 Unauthorized 但是认证需要由代理完成需要通过代理服务器认证代理认证失败
408Request Timeout此响应由一些服务器在空闲连接上发送,即使客户端之前没有任何请求。这意味着服务器想关闭这个未使用的连接请求超时、连接空闲时间过长、服务器关闭未使用的连接请求超时
409Conflict当请求与服务器的当前状态冲突时,将发送此响应资源冲突(如并发更新)、版本冲突、数据不一致资源冲突
410Gone当请求的内容已从服务器中永久删除且没有转发地址时,将发送此响应。客户端需要删除缓存和指向资源的链接资源永久删除、限时服务已过期资源已永久删除
411Length Required服务端拒绝该请求因为 Content-Length 头部字段未定义但是服务端需要它服务器要求必须提供 Content-Length缺少 Content-Length
412Precondition Failed客户端在其头文件中指出了服务器不满足的先决条件条件请求失败(If-Match, If-None-Match, If-Modified-Since 等)、乐观锁冲突条件不满足
413Payload Too Large请求实体大于服务器定义的限制。服务器可能会关闭连接,或在标头字段后返回重试 Retry-After上传文件过大、请求体超过限制请求体过大
414URI Too Long客户端请求的 URI 比服务器愿意接收的长度长URL 过长、GET 请求参数过多URI 过长
415Unsupported Media Type服务器不支持请求数据的媒体格式,因此服务器拒绝请求Content-Type 不支持、文件格式不支持媒体类型不支持
416Range Not Satisfiable无法满足请求中 Range 标头字段指定的范围。该范围可能超出了目标 URI 数据的大小请求的范围无效、范围超出文件大小范围请求无效
417Expectation Failed此响应代码表示服务器无法满足 Expect 请求标头字段所指示的期望服务器无法满足 Expect: 100-continue 等期望期望不满足
418I'm a teapot服务端拒绝用茶壶煮咖啡。这是一个笑话状态码,典故来源茶壶冲泡咖啡幽默场景,实际项目中很少使用-
421Misdirected Request请求被定向到无法生成响应的服务器。这可以由未配置为针对请求 URI 中包含的方案和权限组合生成响应的服务器发送HTTP/2 连接复用场景中的服务器选择错误服务器选择错误
422Unprocessable Entity (WebDAV)请求格式正确,但由于语义错误而无法遵循数据验证失败、业务逻辑错误、WebDAV 协议语义错误
423Locked (WebDAV)正在访问的资源已锁定WebDAV 协议中资源被锁定时资源被锁定
424Failed Dependency (WebDAV)由于前一个请求失败,请求失败WebDAV 协议中,依赖的请求失败时依赖请求失败
425Too Early表示服务器不愿意冒险处理可能被重播的请求防止重放攻击请求过早
426Upgrade Required服务器拒绝使用当前协议执行请求,但在客户端升级到其他协议后可能愿意这样做需要协议升级协议版本不支持
428Precondition Required源服务器要求请求是有条件的。此响应旨在防止'丢失更新'问题防止并发更新冲突、要求条件请求头缺少条件头
429Too Many Requests用户在给定的时间内发送了太多请求("限制请求速率")API 限流、防止 DDoS 攻击、速率限制请求过于频繁
431Request Header Fields Too Large服务器不愿意处理请求,因为其头字段太大。在减小请求头字段的大小后,可以重新提交请求请求头过大(如 Cookie 过多)请求头过大
451Unavailable For Legal Reasons用户代理请求了无法合法提供的资源,例如政府审查的网页法律原因无法访问、内容审查、版权问题法律限制

常见客户端错误对比

状态码认证状态含义区别
401未认证需要身份验证客户端未提供认证信息或认证失败
403已认证权限不足客户端已认证,但没有访问权限
404-资源不存在资源不存在或 URL 错误
410-资源已永久删除资源曾经存在但已永久删除

服务端错误响应 (500-599)

服务端错误响应表示服务器处理请求时发生错误。

状态码名称含义使用场景常见原因
500Internal Server Error服务器遇到了不知道如何处理的情况服务器内部错误、未捕获的异常、配置错误服务器内部错误
501Not Implemented服务器不支持请求方法,因此无法处理。服务器需要支持的唯二方法(因此不能返回此代码)是 GETHEAD请求方法未实现、功能未开发功能未实现
502Bad Gateway此错误响应表明服务器作为网关需要得到一个处理这个请求的响应,但是得到一个错误的响应网关服务器错误、上游服务器无响应、代理服务器问题网关错误
503Service Unavailable服务器没有准备好处理请求。常见原因是服务器因维护或重载而停机服务器维护中、服务器过载、临时不可用服务不可用
504Gateway Timeout当服务器充当网关且无法及时获得响应时,会给出此错误响应网关超时、上游服务器响应超时网关超时
505HTTP Version Not Supported服务器不支持请求中使用的 HTTP 版本使用了服务器不支持的 HTTP 版本HTTP 版本不支持
506Variant Also Negotiates服务器存在内部配置错误:所选的变体资源被配置为参与透明内容协商本身,因此不是协商过程中的适当终点服务器配置错误配置错误
507Insufficient Storage (WebDAV)无法在资源上执行该方法,因为服务器无法存储成功完成请求所需的表示存储空间不足、WebDAV 协议存储空间不足
508Loop Detected (WebDAV)服务器在处理请求时检测到无限循环WebDAV 协议中检测到循环引用循环引用
510Not Extended服务器需要对请求进行进一步扩展才能完成请求需要扩展协议需要扩展
511Network Authentication Required指示客户端需要进行身份验证才能获得网络访问权限公共 Wi-Fi 需要认证、网络访问控制网络认证

常见服务端错误对比

状态码错误类型是否可恢复建议操作
500服务器内部错误可能检查服务器日志,修复代码错误
502网关错误可能检查上游服务器状态,检查网关配置
503服务不可用等待服务恢复,检查 Retry-After
504网关超时可能检查上游服务器响应时间,增加超时设置

状态码快速参考表

最常用的状态码

状态码名称类别使用频率说明
200OK成功⭐⭐⭐⭐⭐请求成功
201Created成功⭐⭐⭐⭐资源创建成功
204No Content成功⭐⭐⭐操作成功但无返回内容
301Moved Permanently重定向⭐⭐⭐⭐永久重定向
302Found重定向⭐⭐⭐⭐临时重定向
304Not Modified重定向⭐⭐⭐⭐使用缓存
400Bad Request客户端错误⭐⭐⭐⭐⭐请求错误
401Unauthorized客户端错误⭐⭐⭐⭐⭐未认证
403Forbidden客户端错误⭐⭐⭐⭐权限不足
404Not Found客户端错误⭐⭐⭐⭐⭐资源不存在
429Too Many Requests客户端错误⭐⭐⭐请求过于频繁
500Internal Server Error服务端错误⭐⭐⭐⭐⭐服务器内部错误
502Bad Gateway服务端错误⭐⭐⭐网关错误
503Service Unavailable服务端错误⭐⭐⭐⭐服务不可用
504Gateway Timeout服务端错误⭐⭐⭐网关超时

按 HTTP 方法推荐的状态码

HTTP 方法成功状态码常见错误状态码说明
GET200, 206400, 404, 500获取资源
POST201, 200, 204400, 401, 403, 409, 422, 500创建资源
PUT200, 204400, 401, 403, 404, 409, 500更新资源(完整)
PATCH200, 204400, 401, 403, 404, 409, 422, 500更新资源(部分)
DELETE200, 204400, 401, 403, 404, 409, 500删除资源
HEAD200400, 404, 500获取响应头
OPTIONS200, 204400, 405, 500获取允许的方法

最佳实践

1. 状态码选择指南

场景推荐状态码说明
资源获取成功200标准成功响应
资源创建成功201创建操作成功,通常包含 Location
资源更新成功200 或 204200 返回更新后的资源,204 不返回内容
资源删除成功200 或 204200 返回删除确认,204 不返回内容
请求格式错误400提供详细的错误信息
需要认证401返回 WWW-Authenticate
权限不足403已认证但无权限
资源不存在404不要泄露敏感信息
请求过于频繁429返回 Retry-After
服务器错误500记录日志,不暴露敏感信息

2. 错误响应格式建议

字段说明示例
statusHTTP 状态码400
error错误类型"Bad Request"
message错误描述"请求参数格式错误"
details详细错误信息(可选){"field": "email", "message": "邮箱格式不正确"}
timestamp错误时间戳(可选)"2025-01-15T10:30:00Z"
path请求路径(可选)"/api/users"

示例 JSON 响应:

{
  "status": 400,
  "error": "Bad Request",
  "message": "请求参数格式错误",
  "details": {
    "field": "email",
    "message": "邮箱格式不正确"
  },
  "timestamp": "2025-01-15T10:30:00Z",
  "path": "/api/users"
}

3. 缓存策略

状态码缓存性Cache-Control 建议说明
200可缓存max-age=3600根据内容设置合适的缓存时间
201不缓存no-cache新创建的资源
204不缓存no-cache无内容响应
301永久缓存max-age=31536000永久重定向
302不缓存no-cache临时重定向
304使用缓存-缓存验证成功
404短期缓存max-age=300避免重复请求
500不缓存no-cache服务器错误
502不缓存no-cache网关错误
503不缓存no-cache, retry-after=60服务不可用

4. 安全最佳实践

实践说明示例
隐藏资源存在性对未授权用户使用 404 而不是 403防止信息泄露
不暴露敏感信息500 错误不返回数据库错误详情只返回通用错误信息
合理使用 401 和 403401 表示未认证,403 表示已认证但无权限明确区分认证和授权
实施速率限制使用 429 状态码防止 DDoS 攻击
记录详细日志服务器端记录详细错误,客户端只返回必要信息便于调试但不泄露信息

5. RESTful API 设计规范

操作HTTP 方法成功状态码错误状态码说明
获取资源列表GET200400, 500返回资源数组
获取单个资源GET200404, 500返回单个资源对象
创建资源POST201400, 401, 403, 409, 422, 500返回创建的资源
更新资源(完整)PUT200/204400, 401, 403, 404, 409, 500替换整个资源
更新资源(部分)PATCH200/204400, 401, 403, 404, 409, 422, 500部分更新资源
删除资源DELETE200/204400, 401, 403, 404, 409, 500删除资源
获取允许的方法OPTIONS200/204400, 500返回 Allow

6. 常见错误处理模式

错误类型状态码响应头响应体
认证失败401WWW-Authenticate: Bearer错误信息
权限不足403-权限说明
资源不存在404-错误信息
方法不允许405Allow: GET, POST允许的方法列表
请求体过大413Retry-After: 60错误信息和限制说明
请求过于频繁429Retry-After: 60错误信息和重试时间
服务不可用503Retry-After: 300错误信息和预计恢复时间

参考资料

资源链接说明
MDN Web DocsHTTP 响应状态码官方文档,本文档主要参考
RFC 7231HTTP/1.1 Semantics and ContentHTTP/1.1 语义和内容规范
RFC 2616HTTP/1.1HTTP/1.1 原始规范
IANA RegistryHTTP Status Code Registry官方状态码注册表
维基百科HTTP 状态码中文维基百科条目

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

oo寻梦in记

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值