响应式流如何与 HTTP 配合使用?什么是响应式http?

dai*_*lee 10 http project-reactor reactive-streams reactive spring-webflux

我对 Reactive Stream 有点陌生,所以在使用Spring WebfluxReactor时遇到了一个问题。

我制作了一个如下所示的片段:

@RestController
public class TestController {
    @GetMapping("responsebody/flux")
    public Flux<String> tt2() {
        return Flux.range(1, 5)
            .delayElements(Duration.ofMillis(1000))
            .map(l -> "hi");
    }
}
Run Code Online (Sandbox Code Playgroud)

而且,有趣的是,镶边分别显示序列中的每个元素,而不是当我仅使用浏览器请求时一次公开所有元素。(但开发工具立即显示全身)

但我想知道,即使 HTTP 1 只使用一个连接,并且服务器发送的数据放在 HTTP 协议的正文中,它是如何工作的。客户端如何知道哪个元素分隔每个元素以及序列何时完成?如果客户端还没有准备好使用反应流怎么办?

我不需要任何使用反应式库的代码,但想知道协议是如何工作的。

ker*_*ter 1

如果客户端还没有准备好使用反应流怎么办?

客户不知道“反应流”。

您想知道的行为是通过分块传输编码机制实现的。当客户端向服务器发送请求时,服务器会返回标头transfer-encoding: chunked

客户端开始以块的形式接收数据。数据以一系列块的形式发送。

在这种情况下,Content-Length 标头被省略,并且在每个块的开头添加十六进制格式的当前块的长度,后跟“\r\n”,然后是块本身,后跟另一个“\r\n” '。终止块是常规块,但其长度为零。接下来是预告片,它由一系列(可能是空的)标头字段组成。