【问题标题】:Is it possible to consume text/event-stream with JavaScript in a WebBrowser?是否可以在 WebBrowser 中使用 JavaScript 使用文本/事件流?
【发布时间】:2021-02-19 15:26:12
【问题描述】:

我们有一个 Rest 服务,它从一个 POST 端点返回一个 text/event-stream,其中包含一系列 JSON 对象。 (它是一个返回 kotlinx.coroutines.flow.Flow<SomeJSONObject> 的 Spring Boot / Kotlin RestController) 现在我们想在一个有角度的 WebApplication 中使用这个事件流,在每个对象到达时对其进行处理。不幸的是,我们不知道这是如何工作的。 我们尝试了一些显而易见的事情,例如:

this.http.post(url, request)

this.http.post(url, request).toPromise().then(value => ...

this.http.post(url, request).subscribe(value => ...

似乎浏览器甚至没有发出请求,也没有收到任何数据。 后端服务工作正常,我们可以通过调用端点来看到这一点,例如邮递员。

只要知道它在 JavaScript 中是如何工作的就足够了,然后它也可以在 Angular 中工作。

【问题讨论】:

    标签: javascript angular event-stream kotlinx.coroutines.flow


    【解决方案1】:

    text/event-stream 是与服务器发送事件关联的 MIME 类型。您可以阅读有关它们的更多信息并查看一些代码示例here,并且有大量在线教程展示了如何将它们与 Angular 一起使用,例如 this one

    这是一个用纯 Javascript 处理服务器发送事件的简单示例 - yourSSEURL 是返回文本/事件流的 URL:

    if(typeof(EventSource) !== "undefined") {
      var source = new EventSource("yourSSEURL");
      source.onmessage = function(event) {
        document.getElementById("result").innerHTML += event.data + "<br>";
      };
    } else {
      document.getElementById("result").innerHTML = "Sorry, your browser does not support server-sent events...";
    }
    

    【讨论】:

    • 谢谢,我们已经使用 SSE,这不是问题。我的问题是,是否可以从 POST 请求接收 EventStream 作为响应并在元素到达时使用它们,而不是像通常情况那样等到收到完整的响应。 Spring Boot 能够为 POST 请求返回 EventStream,但 JS 似乎无法处理。
    • 当你说JS好像不能处理的时候,是不是有具体的错误?您可以添加 onerror 回调来捕获任何错误。顺便说一句,以防万一您使用 Nginx,有一个已知问题可以通过添加 X-Accel-Buffering: no header 来解决
    • 完全没有错误,我们甚至在控制台中都看不到请求。对于我们尝试的所有事情都是如此(-> 参见上面的问题)
    • 所以您的网络选项卡没有显示 Eventstream 连接?试试 Chrome 或 Edge——它们对 SSE 的处理比 Firefox 好得多。您能否通过在与后端相同的服务器上运行浏览器来排除网络问题?
    • 实际上我们在 10 个月前就放弃了,因为我们没有找到解决方案。我们现在做一个“正常”的 POST 并立即收到完整的列表。除非有人确切知道如何在它们到达时将元素作为流和流程元素接收是如何工作的,否则我们不会再投入更多精力。
    猜你喜欢
    • 2011-03-21
    • 2022-11-10
    • 2023-03-16
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    • 2011-04-13
    • 2020-06-26
    相关资源
    最近更新 更多