← 返回题目列表

HTTP 的 Expect: 100-continue 是什么?它解决什么问题?

中等 第 21 / 32 题 更新于 2026/08/02
HTTP状态码大文件上传

简化版

Expect: 100-continue 是客户端在发送大请求体前的一种确认机制。

客户端先发请求头,告诉服务端“我准备发送 body,你先看看请求头是否能接受”。如果服务端返回 100 Continue,客户端再继续发送请求体;如果服务端直接返回 401413417 等错误,客户端就不用浪费带宽上传大 body。

它常用于大文件上传、带认证的大请求、可能被服务端拒绝的请求。

详细版

典型流程是:

POST /upload HTTP/1.1
Host: example.com
Content-Length: 104857600
Expect: 100-continue
Authorization: Bearer xxx

服务端检查请求头、认证、大小限制等条件后,如果允许继续:

HTTP/1.1 100 Continue

客户端再发送 100MB 的请求体。

如果认证失败或请求体太大,服务端可以直接返回:

HTTP/1.1 413 Payload Too Large

这样客户端就避免了无意义上传。

它的收益是节省带宽和时间,代价是多一次等待。如果 body 很小,反而可能增加延迟。

完整版教学

1. 先理解它为什么出现

普通 POST 上传时,客户端通常会把请求头和请求体一起发出去。

如果请求体很大,例如 500MB 文件,而服务端最终因为认证失败、大小超限、接口不存在而拒绝,就会浪费大量网络传输。

Expect: 100-continue 的思路是把发送动作拆成两步:

  1. 先发请求头。
  2. 服务端确认可以继续后,再发请求体。

它的核心价值不是加快所有请求,而是避免“大 body 被服务端早早拒绝时仍然上传”的浪费。

2. 标准交互流程

客户端先发请求头:

POST /videos HTTP/1.1
Host: api.example.com
Content-Type: video/mp4
Content-Length: 524288000
Authorization: Bearer token
Expect: 100-continue

服务端检查请求头。

如果允许上传:

HTTP/1.1 100 Continue

客户端随后发送请求体。

最终服务端处理完成后,再返回真正的最终响应:

HTTP/1.1 201 Created
Content-Type: application/json

注意 100 Continue 是临时响应,不是最终业务响应。

3. 它适合哪些场景

适合场景通常有 3 个特征:请求体大、可能被拒绝、拒绝条件可通过请求头判断。

场景是否适合原因
大文件上传适合可以先检查认证和大小
小 JSON 请求不太适合body 很小,多等一次不划算
需要鉴权的导入接口适合鉴权失败可提前拒绝
普通 GET 请求不适合没有大请求体
网关限流入口适合可在 body 前拒绝

4. 可能返回哪些状态码

服务端可以返回 100 Continue,也可以直接返回最终错误。

常见状态有:

  • 100 Continue:允许继续发送 body。
  • 401 Unauthorized:认证失败。
  • 403 Forbidden:没有权限。
  • 413 Payload Too Large:请求体过大。
  • 415 Unsupported Media Type:媒体类型不支持。
  • 417 Expectation Failed:服务端无法满足 Expect。

如果客户端收到最终错误响应,就不应该继续发送请求体。

5. 工程实现里的等待与兼容问题

真实网络里,客户端不会永远等 100 Continue

很多客户端会设置一个短暂超时,例如等待几百毫秒。

如果服务端没有及时返回 100 Continue,客户端可能会直接发送 body,以避免被不支持该机制的服务端卡住。

这也是为什么它不是万能优化。

它依赖客户端、服务端、代理网关都正确处理临时响应。

6. 和 100 状态码的关系

100 Continue 属于 1xx 信息性状态码。

1xx 响应表示请求还在继续处理中,客户端还会收到后续最终响应。

它和 200 OK201 Created 不是同一类结果。

所以一次使用 Expect: 100-continue 的请求,可能先收到 100,再收到 201

面试中要强调:100 不是上传成功,只是服务端允许继续发请求体。

7. 常见误区与追问

  • 误区:加了 Expect 就一定更快。 小请求会增加等待成本,未必更快。
  • 误区:100 Continue 就表示接口处理成功。 它只是允许继续发送 body,最终结果还要看后续响应。
  • 误区:服务端必须返回 100。 服务端也可以直接返回最终错误响应。
  • 追问:为什么大文件上传适合它? 因为很多拒绝条件可以在上传 body 前通过请求头判断。
  • 追问:代理不支持会怎样? 可能吞掉、延迟或错误处理临时响应,客户端通常需要超时兜底。
  • 追问:它和分块传输有什么区别? Expect 解决是否发送 body,chunked 解决 body 如何分块发送。

8. 加强记忆

记住一句结构:先问能不能传,再决定传不传。

看到 Expect: 100-continue,就联想到大请求体、提前拒绝、节省带宽、临时响应。