Angular 使用异步数据流的合适http内容类型是什么?

Angular 使用异步数据流的合适http内容类型是什么?,angular,spring-webflux,project-reactor,angular-httpclient,Angular,Spring Webflux,Project Reactor,Angular Httpclient,我不熟悉反应式编程。我的应用程序使用了角通量和弹簧通量的组合 因此,我有一个服务器端点,它以1秒的延迟生成Json_值流。[Spring-webflux] @CrossOrigin @GetMapping(value = "/flux" , produces = MediaType.APPLICATION_STREAM_JSON_VALUE) public Flux<ObjType> returnFlux() { return Flux.just(Obj1, Obj2, O

我不熟悉反应式编程。我的应用程序使用了角通量和弹簧通量的组合

因此,我有一个服务器端点,它以1秒的延迟生成Json_值流。[Spring-webflux]

@CrossOrigin 
@GetMapping(value = "/flux" , produces = MediaType.APPLICATION_STREAM_JSON_VALUE)
public Flux<ObjType> returnFlux()
{
    return Flux.just(Obj1, Obj2, Obj3,...)
        .delayElements(Duration.ofSeconds(1));
}
@CrossOrigin
@GetMapping(value=“/flux”,products=MediaType.APPLICATION\u STREAM\u JSON\u value)
公共交通流量
{
返回通量.just(Obj1、Obj2、Obj3等)
.延迟元素(持续时间为秒(1));
}
我的客户端ie.Angular Http希望在数据块可用时立即记录响应。[角度] 我的代码如下所示

public getResponse()
{
    var _reqOptionsArgs= { headers: new HttpHeaders().set( 'Content-Type', 'application/json' ) };

    var observable = this.httpClient.get<any>("http://localhost:8080/flux", _reqOptionsArgs);

    observable.subscribe(val => console.log(val),
                         err => console.error(err),
                         () => console.log('Observer got a complete notification'));
}
public getResponse()
{
var_reqOptionsArgs={headers:new-HttpHeaders().set('Content-Type','application/json');
var observable=this.httpClient.get(“http://localhost:8080/flux“,_要求选项参数);
observable.subscribe(val=>console.log(val),
err=>console.error(err),
()=>console.log('Observer获得了完整的通知');
}
现在,我希望我的方法在通量发出json对象后立即在控制台上记录它们。但当flux发出5个值时,浏览器在等待5秒后抛出异常:

SyntaxError: Unexpected token { in JSON at position 8
    at JSON.parse (<anonymous>)
    at XMLHttpRequest.onLoad (http://localhost:4200/vendor.js:9848:51)
    at ZoneDelegate.invokeTask (http://localhost:4200/polyfills.js:3397:31)
    at Object.onInvokeTask (http://localhost:4200/vendor.js:71849:33)
    at ZoneDelegate.invokeTask (http://localhost:4200/polyfills.js:3396:60)
    at Zone.runTask (http://localhost:4200/polyfills.js:3174:47)
    at ZoneTask.invokeTask [as invoke] (http://localhost:4200/polyfills.js:3471:34)
    at invokeTask (http://localhost:4200/polyfills.js:4609:14)
    at XMLHttpRequest.globalZoneAwareCallback (http://localhost:4200/polyfills.js:4646:21)
SyntaxError:JSON中位置8处的意外标记{
在JSON.parse()处
在XMLHttpRequest.onLoad时(http://localhost:4200/vendor.js:9848:51)
在ZoneDelegate.invokeTask(http://localhost:4200/polyfills.js:3397:31)
在Object.onInvokeTask(http://localhost:4200/vendor.js:71849:33)
在ZoneDelegate.invokeTask(http://localhost:4200/polyfills.js:3396:60)
在Zone.runTask(http://localhost:4200/polyfills.js:3174:47)
在ZoneTask.invokeTask[作为调用](http://localhost:4200/polyfills.js:3471:34)
在invokeTask(http://localhost:4200/polyfills.js:4609:14)
在XMLHttpRequest.globalZoneAwareCallback(http://localhost:4200/polyfills.js:4646:21)
但当我从浏览器触发localhost:8080/flux时,它会在对象发出后立即打印响应

可能我在httpClient中为angular中的响应提供了错误的内容类型。
但与此同时,我很好奇浏览器如何响应这一大块数据。

当您的JSON无效时会发生此错误。尝试调试到达客户端的JSON对象的结构。同时尝试删除http头并让角度http客户端自行处理您遇到的特定错误“我们之所以获得这些内容,是因为流式JSON(
application/stream+JSON
)和普通的旧JSON(
application/JSON
)是两种不同的内容类型。流式JSON的不同之处在于它是由另一个值(通常是换行符)分隔的单个JSON对象的集合,因此它本身不是有效的JSON

话虽如此,使用
HttpClient
还是会有困难的——它的设计目的是读取完整的响应,然后关闭,而不是发送一个JSON流(本质上,这是一个错误的工作工具)

您几乎肯定希望使用
EventSource
,类似于:

var es = new EventSource("http://localhost:8080/flux");
es.onmessage = function(e) {
    console.log(e.data);
}
然后,您可以在
e.data
上调用
JSON.parse()
或类似的函数,并从中执行您喜欢的操作


这里唯一的缺点是,
EventSource
不允许您在没有polyfill的情况下设置HTTP头-但是看起来这可能不是问题。

您可以尝试使用{responseType:'text'}在里面options@kunalverma运气不好!我也尝试过其他内容类型。我觉得这些内容类型中的大多数,如字符串、文本、app/json..都是整体响应。我要寻找的是一种配置,它可以允许http使用可用的响应,而不是等待整个响应。您的内容类型没有问题。http协议是一种无连接协议。如果您想继续使用HTTP,我建议websockets实现这种功能或轮询。@RahulJaswal我说的是“responseType”。。您从web api获得的响应类型……您要么发出标准HTTP请求(1个请求,1个响应,无数据流)或者你正在连接到websocket。angular http客户端仅用于http请求。如果你想建立websocket,你需要做一些不同的事情。但似乎你不确定自己在追求什么