100 Continue
用法
携带 Expect 请求头的客户端希望在传输消息体之前,先确认服务器已准备好接收该消息体。当消息体较大、使用了服务器不接受的内容类型,或用户没有发送文件的权限时,这一流程会在发送消息体之前对这些条件进行校验。
一旦收到 100 Continue 状态码,客户端便会发送消息体。若服务器返回的是 417,客户端则不会继续发送。
将 Expect 请求头与 100-continue 配合使用的优点是:当服务器对接收和处理的内容较为挑剔时,可以节省带宽。
其缺点在于:HTTP 请求头和请求体是分别发送的。在某些环境中,两者容易被分离,从而返回错误而非处理该 HTTP 请求。
示例
请求
PUT /docs HTTP/1.1
Host: example.com
Content-Type: application/pdf
Content-Length: 99000
Expect: 100-continue
响应
HTTP/1.1 100 Continue
请求的后续动作
<PDF file contents are sent as message body>
最终响应
HTTP/1.1 200 OK
客户端计划向服务器发送一个 99 KB 的 PDF 文件进行处理,并在 HTTP 请求中表明这一点,请求预先校验。服务器给出肯定响应,随后客户端发送消息体。作为最终响应,服务器以成功标识结束这次 HTTP 会话。
或者,服务器返回一个错误响应:
HTTP/1.1 417 Expectation Failed
在这种情况下,客户端不会发送该 PDF,后续通信将以一个新的 HTTP 请求开始。
客户端库中的 Expect100Continue
许多 HTTP 客户端库都将 Expect100Continue 暴露为可配置属性。在 .NET 中,ServicePointManager.Expect100Continue 控制 POST 和 PUT 请求是否自动包含 Expect: 100-continue 请求头。禁用该属性会跳过预先校验,直接发送请求体。
代码参考
.NET
HttpStatusCode.Continue
Rust
http::StatusCode::CONTINUE
Rails
:continue
Go
http.StatusContinue
Symfony
Response::HTTP_CONTINUE
Python3.5+
http.HTTPStatus.CONTINUE
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_CONTINUE
Angular
@angular/common/http/HttpStatusCode.Continue