13

Spring boot 2 WebFlux 新版本生成Json流

例如

@GetMapping(value = "stream", produces = APPLICATION_STREAM_JSON_VALUE)
public Flux<Data> stream() {
    return Flux.interval(Duration.ofSeconds(1)).map(Data::new);
}

每隔一秒就会产生发布新数据

{"value":"1"}
{"value":"2"}
{"value":"3"}
{"value":"4"}
{"value":"5"}
{"value":"6"}

我试过 Angular 5 httpclient

findAll(): Observable<Data> {
   return this._http.get<Data>(this.url);
}

但它对我不起作用,因为我想反应它不会向我发送结果,因为它会缓存结果,直到连接关闭

我想问在角度 5 中处理这个 Json 的最佳方法是什么

4

4 回答 4

9

据我所知,仍然没有官方解决方案(19.08.2018),但是我找到了一些解决方法。a 的每个方法HttpClient都有config参数,您可以在其中传递responseType和其他东西。我混合了这些设置,如下所示:

{observe: 'events', responseType: 'text', reportProgress: true}

然后您将收到具有给定类型的事件,范围为 0 到 4。至少在我的情况下type3 是有趣的内容,在 field 中partialText,但是警告 - 在您的情况下,这些消息(在partialTextfield 中)将如下所示:

1 条消息:

{"value":"1"}

2 消息:

{"value":"1"}
{"value":"2"}

3 留言

{"value":"1"}
{"value":"2"}
{"value":"3"}

等等......所以,我已经像下面这样管理它:

method(url, /*if post - body,*/
      {observe: 'events', responseType: 'text', reportProgress: true})
      .pipe(
        filter(e => e.type === 3 && e.partialText),
        map(e => {
          const partials = e.partialText.trim().split('\n');
          return JSON.parse(partials.pop());
        })
      );
于 2018-08-19T07:23:28.757 回答
3

使用服务器发送事件,可以这样完成:

import * as EventSource from 'eventsource';
...

const eventSource = new EventSource("http://www.example.com/stream");

eventSource.onmessage = (event) => {
  const data = JSON.parse(event['data']);
}
于 2018-04-27T20:17:53.007 回答
1

除了使用服务器发送事件或 WebSocket 之外,浏览器客户端无法使用 JSON 流(应用程序/流+json)。

根据您描述的要求和技术,WebSocket 更合适。

于 2018-04-12T17:33:18.260 回答
0

我在想的东西,也许你可以将打开的连接(获取/获取过程)保持在一个火并忘记任务中,然后在另一个异步循环中检查是否有不同的内容而不是存储的内容来保存并显示它.

也许。

于 2021-11-07T16:39:08.797 回答