用途:客户端(比如浏览器)在发送较大数据(比如文件上传)前,先问服务器:“我要发数据了,你准备好了吗?”
服务器回应:
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
还要求"重置"设计初衷:
实际效果:
举个栗子:
205
205
用途:服务器成功返回了客户端请求的部分内容(就像视频"断点续传")
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
→ 返回 300
example.com/en
(英文)和 example.com/cn
(中文)选项文档下载:
300
用途:告诉浏览器或搜索引擎:这个网址已永久迁移到新地址
核心特点:
响应必备:
Location
字段标明新地址(比如 Location: https://新地址.com
)和302(临时跳转)的区别:
301
(永久)搜索引擎会更新记录302
(临时)搜索引擎保留旧地址举个栗子:
网站更换域名:
old.com
→ 返回 301
+ Location: new.com
new.com
HTTP升级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头 → 401
Token过期:
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, POST
POST /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/xml
406
+ 返回支持的类型多语言网站:
Accept-Language: fr-CA
(加拿大法语)406
版本控制:
Accept: application/vnd.api+json; version=2
406
用途:代理服务器要求客户端先认证身份才能转发请求
必备响应头:
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
表单提交:
413
API调用:
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
+ "请用新连接访问"微服务架构:
421
CDN边缘节点错误:
用途:服务器表示:"请求格式正确,但内容逻辑有问题"
典型问题:
必须返回的信息:
{ "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协议版本
常见冲突组合:
安全考量:
举个栗子:
企业内网设备:
505
API网关配置:
黑客试探:
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:
家长控制: