一、信息性响应(1xx):协议交互的中间状态
信息性响应作为临时状态码,主要用于服务器与客户端的协议协商阶段,其存在价值在于优化传输效率并降低无效请求。
1.1 100 Continue:分段请求的确认机制
当客户端发送包含Expect: 100-continue请求头的POST/PUT请求时,服务器返回100状态码表示已接收请求头,允许客户端继续传输请求体。这种设计有效解决了大文件上传时的资源浪费问题:
POST /upload HTTP/1.1Host: example.comContent-Type: application/octet-streamContent-Length: 10240000Expect: 100-continueHTTP/1.1 100 Continue[客户端开始传输10MB文件数据...]
若服务器不支持继续传输,可直接返回417 Expectation Failed终止请求。主流Web服务器如Nginx默认启用此机制,开发者需注意:
- 客户端超时设置应大于2秒(RFC 7231建议)
- 请求体大小超过1MB时强烈建议使用该机制
1.2 101 Switching Protocols:协议升级的标准化流程
在WebSocket、HTTP/2等协议升级场景中,101状态码通过Upgrade和Connection头字段实现平滑切换:
GET /chat HTTP/1.1Host: example.comUpgrade: websocketConnection: UpgradeSec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==HTTP/1.1 101 Switching ProtocolsUpgrade: websocketConnection: UpgradeSec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
开发者需注意:
- 协议升级必须基于持久连接(Keep-Alive)
- 服务器实现需验证客户端的升级请求合法性
- 升级后原HTTP连接终止,新协议接管底层TCP连接
1.3 102 Processing:异步处理的进度标识
WebDAV扩展引入的102状态码,专门用于处理耗时较长的资源操作(如文件复制、权限更新)。服务器返回此状态码后,客户端可通过轮询或WebSocket获取最终结果:
PROPFIND /documents/ HTTP/1.1Depth: infinityContent-Type: text/xmlHTTP/1.1 102 ProcessingRetry-After: 120
典型应用场景包括:
- 分布式文件系统的元数据同步
- 大规模数据仓库的ETL作业
- 机器学习模型的训练任务调度
二、成功响应(2xx):请求处理的最终确认
成功状态码表明服务器已完整处理请求,开发者需根据业务需求选择最精确的状态码。
2.1 200 OK:通用成功响应
作为最常用的状态码,200适用于所有成功获取资源的场景。其响应体格式取决于请求方法:
- GET请求:返回资源表示(JSON/XML/HTML)
- HEAD请求:仅返回响应头
- DELETE请求:返回操作结果摘要
GET /users/123 HTTP/1.1HTTP/1.1 200 OKContent-Type: application/json{"id": 123,"name": "John Doe","email": "john@example.com"}
最佳实践建议:
- 避免在200响应中返回错误信息(如用户不存在仍返回200+空对象)
- 对于敏感数据,需结合401/403状态码进行权限控制
- 缓存策略应通过Cache-Control头明确指定
2.2 201 Created:资源创建的明确标识
当请求触发新资源创建时(如POST到集合端点),201状态码通过Location头返回资源URI:
POST /articles HTTP/1.1Content-Type: application/json{"title": "HTTP状态码详解","author": "DevTeam"}HTTP/1.1 201 CreatedLocation: /articles/456Content-Type: application/json{"id": 456,"status": "published"}
关键实现要点:
- 资源URI必须使用绝对路径(RFC 7231要求)
- 响应体可包含新资源的完整表示或摘要信息
- 结合ETag头实现创建资源的乐观并发控制
2.3 202 Accepted:异步处理的承诺
对于需要长时间运行的请求(如批量数据处理、视频转码),202状态码告知客户端请求已接收但未完成:
POST /batch-jobs HTTP/1.1Content-Type: application/json{"tasks": [{"action": "resize", "params": {"width": 800}},{"action": "watermark", "params": {"text": "Sample"}}]}HTTP/1.1 202 AcceptedLocation: /jobs/789Retry-After: 3600
典型实现方案:
- 通过
Location头提供任务状态查询端点 - 使用
Retry-After头建议客户端轮询间隔 - 结合204 No Content或200 OK返回最终结果
三、状态码选择策略与最佳实践
3.1 精确匹配原则
根据RFC 7231规范,状态码选择应尽可能精确:
- 资源创建必须使用201而非200
- 异步处理优先选用202而非200+进度字段
- 协议升级必须使用101而非自定义重定向
3.2 缓存控制策略
不同状态码对应不同的缓存行为:
| 状态码 | 缓存控制 |
|————|—————|
| 200 OK | 默认可缓存,需配合Cache-Control |
| 201 Created | 通常不可缓存(新资源) |
| 202 Accepted | 禁止缓存(处理中状态) |
| 100 Continue | 临时状态,不涉及缓存 |
3.3 错误处理扩展
成功状态码的异常场景处理:
- 200响应中包含业务错误码(不推荐)
- 202任务失败时返回4xx/5xx状态码(通过查询端点)
- 201创建重复资源时返回409 Conflict
3.4 监控与日志建议
生产环境应记录:
- 状态码分布统计(识别异常流量)
- 102/202请求的处理时长(优化异步任务)
- 201请求的Location头使用情况(检查URI规范性)
四、进阶应用场景
4.1 RESTful API设计
在构建REST接口时,状态码构成重要的语义层:
- 使用200/201/204区分查询/创建/更新操作
- 通过202实现最终一致性模型
- 结合206 Partial Content实现分页查询
4.2 微服务通信
服务间调用推荐:
- 同步调用:200/4xx/5xx直接返回
- 异步调用:202+任务ID模式
- 协议升级:101+gRPC/HTTP2切换
4.3 性能优化
状态码相关的优化手段:
- 启用HTTP/2的服务器推送(103 Early Hints)
- 对200响应实施预加载(Link头)
- 使用100 Continue减少大文件上传延迟
通过系统掌握HTTP状态码的分类与应用场景,开发者能够构建出更健壮、更易维护的Web系统。在实际开发中,建议结合Postman等工具进行状态码模拟测试,并通过日志分析持续优化接口设计。对于高并发场景,特别需要关注100/102等中间状态码的性能影响,合理设置超时与重试机制。