HTTP 100、101、102和103的强大功能 - httptoolkit


您知道HTTP请求可以接收多个响应状态代码吗?服务器可以在最终状态(200、404或任何可能的状态)之前发送不限数量的1XX码。这些充当临时响应,并且都可以包含自己的独立标头。
有几种不同的1XX代码可用:100、101、102和103。它们并未得到广泛使用,但是在某些利基用例中,它们具有一些强大的功能:
 
HTTP 100
HTTP 100是来自服务器的响应,表明请求到目前为止是正确的,并且客户端应该继续运行。
在大多数情况下,这是无人值守的。如果您已经开始发送请求,尽管获得服务器的支持和鼓励总是很不错的,但是您可能还是会继续进行下去。
但是,如果发送包含Expect: 100-continue标头的请求,这将很有用。该标头告诉服务器,您希望得到100响应,您不会发送完整的请求正文直至你接受到100响应。
发送Expect: 100-continue可让服务器决定是否要接收客户端请求的整个主体,因为这个主体内容这可能会花费大量时间/带宽。如果URL和标头足以使其已发送响应(例如,拒绝文件上传),则这是一种快速而有效的方法。
 
HTTP 101
HTTP 101用于切换协议。它说:“我已经向您发送了一个URL和标头,现在我想对此连接做一些完全不同的事情”。不仅是一个不同的请求,而且是完全不同的协议。
主要用例是设置一个websocket。为此,客户端发送包含以下两个标头的请求:

Connection: upgrade
Upgrade: websocket

然后,如果服务器接受,它将发送如下响应:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade

然后从那里开始,他们不再讲HTTP,而是开始在此连接上交换原始Websocket数据。
此状态还用于在同一连接上从HTTP / 1.1升级到HTTP / 2,您也可以使用它将HTTP连接转换为各种其他基于TCP的协议。
也就是说,HTTP / 2不支持此状态,HTTP / 2使用不同的协议协商机制和完全不同的机制来设置websocket(基本上在任何地方都不支持-websockets始终为HTTP / 1.1)。
 
HTTP 102
HTTP 102告诉客户端服务器仍在处理请求,它会回应很快。这与100的不同之处在于,现在已接收到整个请求,并且所有操作现在都在服务器端发生,而客户端只是在等待。
据我所知,这并没有太多使用,它似乎主要是作为保持活动状态存在的,以确保客户端不会认为服务器已经死了。它符合原始的HTTP规范,但已从许多新版本中删除。
尽管如此,它仍在野外的真实环境中得到支持和使用,因此,如果有需要,很有可能在您的应用程序中使用它。
 
HTTP 103
同时,HTTP 103是一种新的流行状态,旨在部分替代HTTP / 2的服务器推送功能(现已从Chrome中删除)。
使用HTTP 103,服务器可以在完全处理请求并发送其余响应之前,尽早发送一些标头。这主要是用于传递链接标头,例如Link: </style.css>; rel=preload; as=style,告知客户端它可能希望尽早开始完整加载的其他内容(例如样式表,JS和图像,用于Web页面请求)。
当服务器收到需要一些处理的请求时,它通常无法完全发送响应头,直到处理完成。HTTP 103允许服务器立即推动客户端并行下载其他内容,而无需等待请求的资源数据准备就绪。