HTTPQUERY
English

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