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的最佳方法是什么
答案 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更适合。