用途:客户端(比如浏览器)在发送较大数据(比如文件上传)前,先问服务器:“我要发数据了,你准备好了吗?”
服务器回应:
100 Continue,表示:“可以发,我等着!”节省资源:避免客户端直接发送大量数据后,才发现服务器不接收,浪费时间和带宽。
举个栗子:
100 Continue → 浏览器开始上传。413 Payload Too Large)→ 上传直接取消。用途:当客户端(比如浏览器)和服务器需要升级通信协议时使用。
交互过程:
Upgrade: websocket)。101 Switching Protocols,之后双方就用新协议通信。关键点:协议切换后,原来的HTTP连接会变成另一种协议(比如WebSocket),继续传输数据。
举个栗子:
101 → 双方开始通过WebSocket实时收发消息。用途:服务器告诉客户端:“你的请求我收到了,但处理起来比较耗时,别急着超时,我还在努力!”
为什么需要它?
和 100 Continue 的区别:
100 是问:“能发数据吗?” → 服务器说:“可以发。”102 是:“数据已收到,正在处理,请耐心等结果。”举个栗子:
102,表示:“正在转码,别关页面!”102,避免客户端以为请求丢失。用途:服务器在正式响应(比如HTML页面)准备好之前,先提前告诉浏览器可以预先加载哪些资源(比如CSS、JS、图片)。
为什么需要它?
103 后:服务器在生成HTML的同时,先发个“预告”:“待会儿要用这些文件,你先去下载吧!”效果:网页加载更快,用户体验更流畅(尤其对慢速网络或复杂网站)。
举个栗子:
103,提示:“你先去加载 styles.css 和 logo.png 吧!”用途:服务器告诉客户端(比如浏览器):“你的请求我成功处理了,这是你要的东西!”
常见场景:
200 + HTML内容。200 + 图片数据。200 + “欢迎页面”。为什么它重要?
举个栗子:
zhihu.com → 服务器返回 200 + 网页内容。200(表示消息发送成功)。用途:服务器告诉客户端:“你让我创建的新资源(比如文件、用户账号、订单)已经成功搞定了!”
200 OK 的区别:200 是通用成功,而 201 专门用于新建资源成功。常见场景:
201 + 用户ID。201 + 文件链接。201 + 订单编号。通常会附带新资源的地址:
Location 字段,告诉客户端:“这是你刚创建的东西的访问路径”。举个栗子:
201 + 微博ID(比如 /posts/123)。my-project 的仓库 → 返回 201 + 仓库地址 github.com/yourname/my-project。用途:服务器告诉客户端:"你的请求我收到了,也接受了,但还没处理完,结果要等等"
200/201 的关键区别:202 表示"已接收但未完成"典型使用场景:
后续跟进方式:
/task-status/123)举个栗子:
202:"视频已接收,正在转码,可通过/task/456查询进度"202:"交易已受理,需要人工审核,2小时内短信通知结果"用途:代理服务器告诉客户端:"这个响应不是我生成的,是原始服务器的,但可能不是最新鲜的"
出现场景:
与200 OK的区别:
200:这是新鲜出炉的数据!203:这是从别处转发的数据,可能有点"回锅"举个栗子:
203)用途:服务器成功处理了请求,但不需要返回任何内容
典型使用场景:
特殊优势:
举个栗子:
点赞功能:
204清空购物车:
204 表示成功用途:服务器告诉客户端(通常是浏览器):"请求已成功处理,现在请清空当前表单/显示内容,方便用户重新输入"
204 的关键区别:204 只是"完成",205 还要求"重置"设计初衷:
实际效果:
举个栗子:
205205用途:服务器成功返回了客户端请求的部分内容(就像视频"断点续传")
Range 请求头使用Content-Range 说明这是哪一部分为什么需要它:
特殊优势:
举个栗子:
206 + 视频的10-20MB片段用途:当客户端一次请求多个操作时,服务器返回每个操作的独立状态
数据格式:
典型场景:
举个栗子:
网盘批量操作:
207[
{ "file1.txt": 204 }, // 成功
{ "file2.jpg": 404 }, // 不存在
{ "file3.pdf": 403 } // 无权限
]
智能家居控制:
用途:在批量查询时,避免重复返回之前已经报告过的结果
207 Multi-Status 使用工作流程:
208占位核心价值:
举个栗子:
同步网盘文件列表:
208表示"这些没变过"日历系统同步:
208用途:服务器对实例操作(Instance Manipulation)的确认
核心特点:
IM(Instance Manipulation)字段优势:
举个栗子:
在线文档协作:
226 + 只含第5行变化的差分数据APP增量更新:
226)用途:服务器提供多个可选资源版本,需要客户端/用户选择其中一个
200)或重定向(用301/302)典型情况:
响应特点:
Location 或 Alternates 头列出选项举个栗子:
国际网站访问:
example.com → 返回 300example.com/en(英文)和 example.com/cn(中文)选项文档下载:
300用途:告诉浏览器或搜索引擎:这个网址已永久迁移到新地址
核心特点:
响应必备:
Location 字段标明新地址(比如 Location: https://新地址.com)和302(临时跳转)的区别:
301(永久)搜索引擎会更新记录302(临时)搜索引擎保留旧地址举个栗子:
网站更换域名:
old.com → 返回 301 + Location: new.comnew.comHTTP升级HTTPS:
http://example.com → 301 跳转到 https://example.com用途:服务器告诉浏览器:"你要找的东西临时放在另一个地址,先去那里拿"
核心特点:
响应必备:
Location 字段标明临时地址(如 Location: /temp-page)举个栗子:
网站维护:
302 跳转到维护公告页登录跳转:
/admin → 临时跳转到 /login(登录后仍返回/admin)A/B测试:
用途:服务器明确要求客户端用GET方法去另一个地址查看结果
核心特点:
Location 字段(指向新地址)设计初衷:
举个栗子:
表单提交成功:
303 跳转到 /order-success支付完成跳转:
303 跳转到账单详情页用途:服务器告诉浏览器:"你要的资源没变化,直接用本地缓存吧!"
触发条件:
If-Modified-Since(上次修改时间)或 If-None-Match(文件指纹)核心优势:
注意:
举个栗子:
刷新新闻网站:
304),继续用你缓存的版本吧"加载网页图片:
304用途:服务器明确要求客户端必须通过指定的代理服务器访问资源
Location 字段)设计初衷:
核心特点:
http:// 或 https:// 开头现状:
举个栗子:
公司网络限制:
305 + 代理地址 proxy.company.com:8080学校上网认证:
原始用途:
现状:
为什么被废弃:
用途:服务器告诉浏览器:"资源临时搬到新地址,但必须用原来的方式访问"
典型场景:
响应必备:
Location 字段标明临时地址举个栗子:
支付系统维护:
307 跳转到备用服务器API临时迁移:
/v1/orders → 307 临时指向 /temp/v1/orders用途:服务器声明:"资源已永久搬家,且要求所有访问必须保持原始请求方式"
301 + 307 的结合体:既永久,又保持请求方法Location 指向新地址核心特点:
适用场景:
举个栗子:
银行系统升级:
POST /transfer → 308 永久跳转到 POST /api/v2/transfer全站HTTPS化:
http://example.com/login → 308 跳转到 https://example.com/login用途:服务器表示:"我看不懂你的请求,就像读到了一封错别字连篇的信"
常见触发原因:
Content-Type)举个栗子:
API调用错误:
{"name": "张三"(缺少闭合括号)→ 返回 400网页表单提交:
400 + "密码不能为空"文件上传失败:
400 + "文件过大"用途:服务器表示:"你需要先登录/提供有效凭证才能访问这个资源"
核心特点:
WWW-Authenticate 字段,说明认证方式Basic 基础认证 / Bearer Token认证)401:"你还没证明你是谁"403:"我知道你是谁,但你不配访问"常见认证方式:
举个栗子:
网页未登录访问:
/admin → 401 + 弹出浏览器登录框API调用缺失Token:
GET /api/user 未带Authorization头 → 401Token过期:
401 + "Token expired"设计初衷:
实际使用:
403或自定义逻辑响应特点:
Payment Required 或 Upgrade Required 提示举个栗子:
付费API调用:
402 + "请订阅高级套餐"下载付费内容:
402 跳转到支付页面用途:服务器明确拒绝请求,即使客户端提供了身份认证
401:"你是谁?先证明身份"(未认证)403:"我知道你是谁,但你不配访问"(已认证但无权限)404:"你要的东西不存在"403:"东西存在,但就不给你看"常见触发原因:
/etc/)特殊变体:
403.1:执行访问被禁止(如禁止运行脚本)403.2:读取访问被禁止403.14:目录列表被禁止(常见于关闭了目录浏览的网站)举个栗子:
网站后台封锁:
/admin → 403 + "您无权查看此页面"API权限控制:
403 + "请升级会员"云服务器配置:
.env 配置文件 → 403(防止泄露数据库密码)用途:服务器明确告知:"你要的东西在我这里不存在"
常见触发原因:
prduct.html 少了个字母)/blog/ 但目录里没有 index.html)特殊性质:
举个栗子:
日常上网:
example.com/old-page → 显示 404(页面已迁移)API调用:
GET /api/users/999 → 404(用户ID不存在)资源失效:
404用途:服务器表示:"我认识这个地址,但不接受你用的动作类型"
Allow 头,列出支持的请求方法(如 Allow: GET, POST)常见冲突场景:
POST/PUT/DELETE 请求GET 请求提交表单数据(应该用POST)与其他错误的区别:
404:地址完全不存在403:地址存在但没权限405:地址存在,但动作不被支持举个栗子:
错误调用API:
DELETE /api/articles 想删除所有文章 → 405 + Allow: GET, POSTPOST /api/articles/batch-delete)网页表单提交:
GET /submit-form 提交密码 → 405(应该用POST)只读资源:
PUT /about.html 修改公司介绍页 → 405(静态页面禁止修改)用途:服务器表示:"你要的数据格式/语言/版本我提供不了"
Accept 头提出了过于挑剔的要求常见触发条件:
Accept:要求返回XML但服务器只支持JSONAccept-Language:要求法语内容但只有英文版Accept-Encoding:指定了不支持的压缩格式必须返回的信息:
Content-Type: application/json)举个栗子:
API格式冲突:
Accept: application/xml406 + 返回支持的类型多语言网站:
Accept-Language: fr-CA(加拿大法语)406版本控制:
Accept: application/vnd.api+json; version=2406用途:代理服务器要求客户端先认证身份才能转发请求
必备响应头:
Proxy-Authenticate:说明认证方式(如 Basic/Bearer)Proxy-Authorization:客户端后续请求需携带此头典型场景:
举个栗子:
企业网络上网:
API调用经过网关:
GET /api/data HTTP/1.1 Host: example.com
触发条件:
常见原因:
与其他超时的区别:
504:服务器处理超时(后端程序太慢)408:客户端发送请求太慢(请求头发送不全/请求体传一半断了)举个栗子:
上传文件失败:
408弱网环境访问:
408服务器防御机制:
408 打断攻击用途:服务器检测到请求与当前资源状态冲突,拒绝执行
常见冲突类型:
必须返回的信息:
{"error": "File version 123 is stale"})举个栗子:
购物车冲突:
409 + "库存不足"协同编辑:
409 + 显示差异对比银行转账:
409 + "请刷新重试"用途:服务器明确声明某个资源曾经存在,但现已永久删除
404:"从未见过这个资源"(可能输错URL)410:"这资源以前有,现在故意删除了"301:资源永久搬家410:资源永久消失设计意图:
典型场景:
举个栗子:
社交媒体:
410 + "该账号已注销"电商平台:
410(而404可能意味着商品ID错误)API版本:
410 + 替代方案链接用途:服务器要求客户端必须提供请求体的明确长度
Content-Length 请求头声明(如 Content-Length: 1024)触发条件:
Content-Length 头安全意义:
举个栗子:
文件上传API:
POST /upload HTTP/1.1 Host: example.com (缺失 Content-Length 头)
严格的后端服务:
411用途:服务器检测到客户端设置的条件不满足,拒绝执行请求
常见前置条件:
If-Match:要求资源版本号匹配(如ETag)If-Unmodified-Since:要求资源在指定时间后未修改If-None-Match:要求资源版本不同(用于缓存刷新)设计初衷:
举个栗子:
在线文档协作:
412支付系统:
412用途:服务器拒绝处理超过大小限制的请求数据
典型限制维度:
client_max_body_size 1m)与其他错误的区别:
400:数据格式错误403:权限不足413:数据体积超标举个栗子:
网盘上传:
413表单提交:
413API调用:
413触发条件:
large_client_header_buffers 4 8k(单个URI头最多8KB)典型问题场景:
?id=1&name=张三&age=20&...拼接100个字段)安全意义:
举个栗子:
错误的分页查询:
GET /api/data?page=1&size=10&sort=name&filter=type=news&search=2023年最新...(2000字符后截断)
返回 414
前端bug:
?param=1¶m=1¶m=1... 的无限长URL爬虫攻击:
用途:服务器拒绝处理不支持的请求格式
Content-Type 头声明了服务器无法处理的格式常见冲突场景:
application/xml 调用只支持JSON的API.exe 文件到仅允许图片的接口Content-Type 头(可能被默认当作错误类型)必须返回的信息:
Accept 字段,列出支持的格式(如 Accept: application/json)举个栗子:
API调用错误:
返回 415 + Accept: application/json
图片上传限制:
.mp4 到头像接口 → 415 + "仅支持JPEG/PNG"用途:服务器告知客户端请求的文件范围超出实际大小
Range 头指定了非法范围(如 bytes=500-1000,但文件只有300字节)必备响应头:
Content-Range:显示文件实际大小(如 Content-Range: bytes */300)常见触发原因:
举个栗子:
视频加载失败:
416下载管理器错误:
用途:服务器无法满足客户端在 Expect 请求头中提出的特定要求
经典场景:
Expect: 100-continue(客户端问:"能接收大文件吗?")417 表示:"别传了,我拒绝"与其他状态码的区别:
400:通用请求错误412:前置条件不满足(针对资源状态)417:明确拒绝客户端的Expect要求举个栗子:
大文件上传被拒:
特殊需求不被支持:
起源:1998年愚人节的恶搞RFC文档(RFC 2324)
实际意义:
意外走红:
举个栗子:
API的彩蛋响应:
418 + { "message": "我是茶壶,不能自毁" }机器人防护:
程序员节日彩蛋:
出身:
实际作用:
文化意义:
举个栗子:
API限流:
HTTP/1.1 420 Enhance Your Calm
Retry-After: 30
{
"message": "放松呼吸30秒再试",
"tip": "试试冥想APP Headspace"
}
游戏防沉迷:
程序员彩蛋:
// 这里本应该429,但我们更禅意)用途:服务器告知客户端请求发错了地方
核心原因:
必备响应头:
Connection: close(强制关闭当前错误连接)举个栗子:
网站迁移后:
421 + "请用新连接访问"微服务架构:
421CDN边缘节点错误:
用途:服务器表示:"请求格式正确,但内容逻辑有问题"
典型问题:
必须返回的信息:
{
"error": "验证失败",
"details": {
"birthday": "不能是未来日期",
"department_id": "该部门不存在"
}
}
举个栗子:
注册表单:
422 + "密码至少6位"电商下单:
422(而404是ID不存在)日历系统:
422用途:服务器声明资源已被显式锁定,禁止并发修改
锁定类型:
必备响应头:
Lock-Token:标识当前锁的IDTimeout: Infinite)举个栗子:
云文档协作:
423 + "该文件正在被A编辑"版本控制系统:
数据库运维:
用途:服务器表示当前操作依赖的其他操作失败了
典型场景:
必须返回的信息:
<!-- WebDAV示例 --> <error> <failed-dependency>/files/important.doc</failed-dependency> <reason>File is locked</reason> </error>
举个栗子:
云盘批量操作:
424 + 列表显示失败项电商下单流程:
424 回滚整个订单CI/CD流水线:
用途:服务器拒绝处理可能引发重放攻击的过早请求
核心机制:
安全意义:
举个栗子:
网购支付:
425:"请重新输入短信验证码"游戏登录:
用途:服务器强制要求客户端升级协议版本
核心机制:
Upgrade 响应头指明所需协议(如 Upgrade: TLS/1.3)典型场景:
举个栗子:
浏览器访问:
GET / HTTP/1.1 Host: example.com
APP接口调用:
426 + "请升级到v2.0"用途:服务器要求客户端必须携带校验条件才能处理请求
常见前置条件:
If-Match:要求资源版本匹配(防覆盖)If-None-Match:要求资源已变更(防重复)安全价值:
举个栗子:
在线文档保存:
428 + "请携带文档当前ETag"支付系统:
428 + "需提供短信验证码"API设计:
X-Idempotency-Key 头用途:服务器温柔地警告客户端请求频率超标了
核心机制:
Retry-After 头告知冷却时间(如 Retry-After: 30)常见触发场景:
举个栗子:
登录失败限流:
429 + "请1分钟后再试"抢购活动:
429 + "当前排队人数过多"免费API限制:
429非官方实验性状态码
核心作用:
举个栗子:
视频流预判缓冲:
游戏同步:
物联网控制:
触发条件:
large_client_header_buffers 4 8k(单个头最大8KB)典型问题:
X-User-Info携带完整用户数据)安全意义:
举个栗子:
Cookie爆炸:
431过度追踪:
X-Tracking-*头 → 触发限制代理服务器错误:
Via头 → 最终超限用途:服务器依法拒绝提供某些内容
必须包含的信息:
X-Censorship-Reason: DMCA)名字彩蛋:
举个栗子:
版权投诉:
451 + "应版权方要求移除"地区封锁:
451 + "因GDPR限制不可用"政府审查:
451 + "根据XX法规屏蔽"用途:服务器承认"我炸了,但不知道具体哪炸了"
经典翻车现场:
尴尬特点:
举个栗子:
网站崩溃:
API抽风:
/api/users → 返回 500(后端代码抛异常没捕获)运维事故:
用途:服务器坦白承认"这个功能我压根没做"
典型场景:
与500的区别:
500:"我尝试做了但失败了"501:"这需求我根本不会做举个栗子:
API版本过新:
GET /api/v3/users → 501(服务器只实现到v2)特殊操作:
PURGE /cache 请求 → 501(未启用缓存清理功能)超前功能:
501(该功能尚在PPT阶段)角色定位:
经典故障链:
常见凶手:
举个栗子:
网站访问:
微服务调用:
运维事故:
故障排查指南:
ps aux | grep node)tail -f /var/log/nginx/error.log)curl -v http://localhost:3000)mysql -u root -p)htop看CPU/内存)核心特征:服务器主动声明"我现在不能服务,但还会回来"
常见触发场景:
友好设计:
Retry-After 头(如 Retry-After: 3600)举个栗子:
网站维护:
API限流:
503 + "请1小时后重试"云服务故障:
角色定位:
典型超时场景:
关键数字:
举个栗子:
网站访问:
支付接口:
运维事故:
核心问题:服务器明确拒绝客户端使用的HTTP协议版本
常见冲突组合:
安全考量:
举个栗子:
企业内网设备:
505API网关配置:
黑客试探:
HTTP/9.9请求 → 服务器返回505用途:服务器发现内容协商陷入死循环
典型故障链:
本质问题:
举个栗子:
国际化网站故障:
/doc → 可选英文/中文 → 选择中文 → 中文版又需要选简/繁体 → 506版本控制API:
/api/v2 需要进一步选择 v2.1 或 v2.2 → 协商失败用途:服务器明确表示"我的硬盘/内存不够存你的东西了"
常见场景:
必备响应头:
X-Disk-Space-Available: 1024(剩余字节数)/old_backups/)举个栗子:
网盘上传失败:
507 + "剩余空间仅30GB"邮件系统崩溃:
运维事故:
用途:服务器检测到请求处理陷入死循环
典型循环场景:
安全机制:
举个栗子:
网站目录结构错误:
/photos/2023 链接到 /archive → /archive 又链接回 /photos → 508微服务调用死循环:
运维配置事故:
a.example.com CNAME到 b.example.com → 结果 b 又指向 a用途:服务器要求客户端必须支持扩展功能才能继续
核心条件:
MUST 扩展声明Extension 头说明要求现代应用:
举个栗子:
企业软件API:
GET /api/advanced-analytics → 返回510 + "需购买高级许可证"
智能家居控制:
510用途:强制用户在使用网络前先认证
必备要素:
Location: http://auth.wifi.com)Network: WiFi 等网络类型标识常见触发点:
举个栗子:
星巴克Wi-Fi:
511公司VPN:
家长控制: