HTTP 中的多重响应合法吗?

Posted

技术标签:

【中文标题】HTTP 中的多重响应合法吗?【英文标题】:Are multiple responses legal in HTTP? 【发布时间】:2019-04-13 08:43:37 【问题描述】:

我对 HTTP 协议的细微差别有点生疏,我想知道它是否可以直接支持发布/订阅?

HTTP 是一种请求响应协议。所以客户端发送一个请求,服务器发回一个响应。 在 HTTP 1.0 中,每个请求都会建立一个新连接。 现在,HTTP 1.1 对 HTTP 1.0 进行了改进,允许客户端保持连接打开并发出多个请求。

我意识到您可以将 HTTP 连接升级到 websocket 以实现快速的 2 路通信。我很好奇的是这是否是绝对必要的?

例如,如果我请求资源“http://somewhere.com/fetch/me/slowly”

服务器可以直接回复两次吗? 比如先用一个202接受 然后在内容准备好后不久, 但是没有客户端先发送额外的请求?

Client: GET http://somewhere.com/fetch/me/slowly
Server: 202 "please wait..."
Server: 200 "here's your document"

以这种方式实现发布/订阅服务是否正确? 例如:

Client: http://somewhere.com/subscribe
Server: item 1
...
Server: item 2

我的印象是这种“可能”有效,因为客户端通常会有一个事件循环来监视连接,但在技术上是错误的(因为遵循协议的客户端不需要以这种方式实现)。

但是,如果您使用chunked transfer encoding,这将起作用。

HTTP/2 似乎也允许这样做,但我不清楚是否进行了某些更改以使其成为可能。

我没有看到太多关于 pub/sub 的讨论,那么如果使用带或不带分块编码的普通 HTTP/1.1 有什么问题呢?

如果可行,为什么需要 RSS 或 ATOM 之类的东西?

【问题讨论】:

【参考方案1】:

一个 HTTP 请求可以有多个“响应”,但响应都有1xx 范围内的状态码,例如102 Processing。

但是,这些响应只是标题,而不是正文。

HTTP/1.1(就像之前的 1.0)是一个request/response 协议。不允许发送未经请求的响应。 HTTP/2 是一个帧协议,它添加了server push,它允许服务器建议提供额外的数据并并行处理多个请求,但不会改变其请求/响应性质。

可以保持 HTTP 连接打开并继续发送更多数据。许多(音频、视频)流媒体服务都会使用它。

但是,这看起来只是一个持续流式传输的连续体,而不是许多多个 HTTP 响应。

如果这行得通,你为什么需要 RSS 或 ATOM 之类的东西

因为保持 TCP 连接打开不是免费的。

【讨论】:

我想我可以通过一个小的调整来接受这个答案。我自己试试,你可以酌情改正。 我已尝试进行编辑,但我对未能定义“帧协议”并不完全满意。 @BruceAdams 我有点不同意你的编辑,我不认为使用 HTTP/2 推送是一个合适的用途。 HTTP/2 实际上只是为了乐观地填充缓存。它不应该用作类似 pub/sub 的系统。 是的。用“但不改变其请求/响应性质”的措辞很糟糕是不够的。

以上是关于HTTP 中的多重响应合法吗?的主要内容,如果未能解决你的问题,请参考以下文章

我可以从 http 模块 .get 响应中获取 nodejs 中的完整 http 响应文本吗?

多重响应分析,多选题二分法思路

您可以自定义 Ktor 401 - 未经授权的响应吗?

CLMM 事后多重比较,包括响应变量的水平

如何避免来自 HttpURLConnection 的空 HTTP 响应出现 EOFException?

HTTP协议请求响应模型