如何处理角度为5的弹簧启动2发出的json流

时间:2018-03-02 08:45:19

标签: angular spring-boot jsonstream

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的最佳方法是什么

3 个答案:

答案 0 :(得分:3)

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

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

然后,您将收到具有给定类型的事件,范围在0到4之间。至少在我的情况下,type 3是有趣的内容,它位于字段partialText中,但是警告-在您的情况下,消息(在partialText字段中)如下所示:

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());
        })
      );

答案 1 :(得分:2)

使用Server-Sent Events,可以这样做:

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

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

eventSource.onmessage = (event) => {
  const data = JSON.parse(event['data']);
}

答案 2 :(得分:0)

除了使用Server-Sent Events或WebSocket之外,浏览器客户端无法使用JSON流(application / stream + json)。

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