首页 > 解决方案 > http1.1 中是否有任何内容表明我无法在请求正文发送完成之前发送响应?

问题描述

在 http2 中,您可以在请求正文完全发送之前将标头响应发送回。当然,您必须处理发送 http 200 OK 响应,然后再发送失败的问题。这对我们来说很好。我想知道 ndjson 的流式上传案例,如果我们可以这样做。在流完全发送之前发回响应。

IE。1. 收到 http1.1 请求 2. 我们进行身份验证,如果成功,我们在他们流式传输请求正文时发回 http 200 OK 3. 当我们处理 ndjson 流时,每条记录,我们流回成功或失败这样他们就可以轻松地从中断的地方继续

然后,此解决方案允许他们发送 1 条记录或他们想要的尽可能多的记录。我知道我们拥有的网络服务器支持这一点,但不确定所有客户端。我很好奇规范中是否有任何内容表明这违反了规范?

谢谢,院长

标签: http2http-1.1

解决方案


在 HTTP/1.1 中也可以在读取请求内容之前发送响应头。

事实上,从历史上看,这在 HTTP/1.1 中一直是可能的,而 HTTP/2 只是从其前身继承了这种行为。

一个典型的情况是当服务器应用程序产生一个意外错误时(例如,在 Java 中,a NullPointerException):服务器应用程序无法读取客户端仍在发送的请求内容(因为意外错误),而服务器通常会产生一个响应 500 表示它想要关闭连接。

另一个典型案例是回显或转换服务器,您可以在其中上传一些即时回显或转换并发送回客户端的内容。

代理是 HTTP 是全双工的一个主要示例 - 代理在将请求内容发送到服务器之前不会缓冲请求内容,如果服务器在代理发送请求时回复,则代理不会缓冲响应内容要么(等待请求完成) - 它只是将响应内容发送给客户端。

虽然规范中没有明确说明这种全双工行为,但它显然发生在现实生活中,因此客户端和服务器都应该正确处理这种情况。

如果我理解正确,您可以在 HTTP 之上使用 JSON 协议来通知客户端服务器已处理的每个 JSON 块。您基本上有一个带有“长”响应的“长”请求,这在任何体面的 HTTP 实现中都应该可以正常工作。


推荐阅读