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 响应文本吗?