当前位置: 首页 > 面试题库 >

端到端响应式流RESTful服务

魏健柏
2023-03-14
问题内容

问题很简单:假设我有一个完全可响应的后端,如何将其流式传输到浏览器(例如大文本),并在每个块来自服务器时立即将它们打印给用户

可能我缺少一些重要的概念性要点,但是我所需要知道的是:是否可以通过一个HTTP
GET(或否)请求发送少量数据(从服务器到浏览器)?关键是:在发送全部数据之前,我可以写那些小的部分吗?

谢谢你的帮助。我以前确实尝试过google,但是我总是会得到其他概念(例如websockets,long-
polling,react.js)的信息,我认为并非如此。

编辑:我不要求特定的API ou库。我只是想了解这个概念,例如:“您不能使用HTTP协议来做到这一点!”
或“这与反应式编程无关,您对流的真正含义感到困惑。请参阅’something_else.js’”。

EDIT2:我通过以下方法使用spring-mvc(spring-boot)做了一个小的rest控制器:

@RequestMapping(value = "/flush", method = RequestMethod.GET)
public void flushTest(HttpServletResponse response) {

    response.setContentType("text/html");
    response.setStatus(SC_OK);

    try (ServletOutputStream outputStream = response.getOutputStream()) {
        for (int i = 0; i < 3; i++) {
            String chunk = "chunk_" + i;
            outputStream.print(chunk);
            outputStream.flush();
            response.flushBuffer();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

}

在浏览器中,即使使用flushBuffer,也只有整个响应到达。经过一些研究,这可能是TOMCAT问题,我更改了pom.xml并包括了underwow:

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-undertow</artifactId>
</dependency>

使用默认配置:

server.undertow.accesslog.enabled=true
server.undertow.accesslog.dir=target/logs
server.undertow.accesslog.pattern=combined
server.compression.enabled=true
server.compression.min-response-size=1l

这时,在我的IDE中使用调试,每个块都在flushBuffer之后写入。

因此,我相信这可能是TOMCAT配置。长话短说,我知道“流式解决方案”上有很多东西可以帮助我,感谢所有评论,但是我的问题有点概念性。


问题答案:

HTTP之上有一个协议,该协议允许使用HTTP传输以较小的,易于使用的块形式将服务器响应传递给浏览器。它称为 SSE (服务器发送事件)或
EventSource ,这里是有关该主题的相当完整的文章。

还有其他使用HTTP协议流数据的方法。一种这样的替代方法是JSON流传输,其中您可以从服务器在线路上编写部分响应,并在到达JSON块时使用它们。在消费方面,一个流行的库称为Oboe.js,在服务器端,您基本上需要在要发送或可用时在响应线路上写入部分数据。

对于这两种html" target="_blank">方法,Rx对于处理服务器端的流逻辑都是有用的。您将片段建模为流(处理错误等),最终在订户中将单个发射写在导线上,在Observable完成时关闭响应。

客户端,可以将EventSource事件包装在新的Observable中(通过Rx.Observable.create()),并作为流进行进一步处理。Oboe.js事件也可以转换为Observables(通过Rx.Observable.fromEvent()



 类似资料:
  • 我正在尝试编写同时使用gRPC和REST的服务。实现技术有Java、Spring-Boot和gRPC。使用场景示例如下: 目的是有外部客户端可以通过RESTendpoint和/或通过进行gRPC调用与应用程序交互。在内部,有“网关”服务提供外部接口,并负责在外部客户端和执行实际工作的“域”服务之间传输/路由请求和响应。内部服务将通过gRPC进行通信。 外部客户端不知道如何在内部处理事情,域服务没有

  • 在浏览器发送 Ajax 请求之后,下一步骤自然是服务器响应。服务器在接收到请求之后会进行一系列处理步骤,最终返回结果。而与此同时,客户端会在接收到返回的结果之后进行界面的展示或者数据的处理。 本章节主讲 Ajax 收到返回数据后处理服务器响应过程。 前言 本章节将会从两个方面来讲解 Ajax 如何处理服务端响应,它们分别是: 处理的时机 处理的方法 如果你不知道 Ajax 是如何获取服务端响应内容

  • 我在一些应用程序中尝试公开一些RESTful Web服务。不幸的是,我被卡住了。项目构建和部署很好,但我无法使用GET请求访问我的服务。 我的战争看起来很像:战争。 我得到了空的: 应用类别: 和服务类:import javax。ejb。无国籍;导入javax。ws。rs.GET;导入javax。ws。rs.路径;导入javax。ws。rs.PathParam;导入javax。ws。rs.产品;导

  • 我有一个Android Studio应用程序,用于客户端读取加速计的数据,并将其发送到运行TCP C套接字服务器的计算机。 我想等到服务器确认接收到数据后再发送一个。当我不得不从Android系统读取服务器的确认信息时,问题就出现了,这只是简单的崩溃,我不知道为什么。这是我使用的代码。 服务器代码 和客户端代码(Android Studio) 我在交流中遗漏了什么还是我做错了什么?

  • 24.10 在客户端访问RESTful服务 RestTemplate是客户端访问RESTful服务的核心类。它在概念上类似于Spring中的其他模板类,例如JdbcTemplate、 JmsTemplate和其他Spring组合项目中发现的其他模板类。 RestTemplate’s behavior is customized by providing callback methods and c

  • 例如,在本文中,我试图理解为什么在流中使用flatmap()(直接从引用中粘贴副本) AFAIK,应用于流的平面图会为流中的每个输入值产生任意数量的值(0... n)。所以一个平面图需要一个产生流的函数。 通量发射0个或多个项目,然后可选地完成或偏离。 那么,响应流上到底发生了什么?这是接收响应流并发出0个或更多类警报对象的函数吗?因此,如果我们