当前位置: 首页 > 知识库问答 >
问题:

什么是适合使用异步数据流的超文本传输协议内容类型?

林涵映
2023-03-14

我是被动编程的新手。我的应用程序使用了Angular和Spring的组合。

因此,我有一个服务器endpoint,它以1秒的延迟生成Json_值流。[Spring-网络流量]

@CrossOrigin 
@GetMapping(value = "/flux" , produces = MediaType.APPLICATION_STREAM_JSON_VALUE)
public Flux<ObjType> returnFlux()
{
    return Flux.just(Obj1, Obj2, Obj3,...)
        .delayElements(Duration.ofSeconds(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'));
}

现在,我希望我的方法在通量发出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)

但是当我触发来自浏览器的localhost:8080/flux时,它会在对象发出后立即打印响应。

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

共有2个答案

公冶鸣
2023-03-14

当JSON无效时,会发生此错误。尝试调试到达客户端的JSON对象的结构。还可以尝试删除超文本传输协议头,让角超文本传输协议客户端自己处理它们

柴瀚
2023-03-14

您遇到的特殊错误是,流式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);
}

然后可以调用JSON。在e.data上解析()或类似内容,然后从中执行您喜欢的操作。

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

 类似资料:
  • 我以前问过这个问题,但没有得到答案。我可以使用下面的方法:“get”让它工作,所以这没关系,但这次我需要使用post。在另一个项目中(使用react、redux、php、webpack、xampp),同样的问题再次出现,我正在努力解决它。这就是: register.php index.js 当我做了以上的一切是好的,数据是日志作为'做某事'。但是,当我尝试使用axios({方法:'POST'})并

  • 我正在使用oauth签名生成我的oauth签名,以便与woocommerce api连接。我遵循了woocommerce rest api文档中所述的所有步骤: 所需的参数是:oauth_consumer_密钥、oauth_时间戳、oauth_nonce、oauth_签名和oauth_签名方法。oauth_版本不是必需的,应该省略。OAuth nonce可以是消费者密钥唯一的任意随机生成的32个字

  • 我想在vertx API响应中以CSV文件的形式从DB返回一些数据。我一直在关注这个链接 但是我无法返回正确的CSV文件作为API响应。 我的代码:

  • 我尝试使用以下方法从Api获取json数据 我将这个物体建模如下 数据如下: 当我尝试使用模型访问时,我收到错误“\u InternalLinkedHashMap”

  • 我有一个由Python构建的API服务器。我需要一组客户端/计算机通过发出http post请求将数据发送到API服务器。 这里的数据实际上是html内容。(注意:我没有将合法数据转换为HTML/XML格式,数据本身就是我从web上收集的HTML),通常每页约200KB。我正试图通过使用串行/串行和压缩来尽可能减轻网络负载。 我正在考虑通过网络发送原始超文本标记语言。有没有类似序列化html对象的

  • 我想知道你对这个概念的看法/意见。如果有替代方案?这是否可行/有益? 据我所知,对于每个http请求,服务器都会执行一些操作并返回http响应。 现在考虑任何场景,我们希望对服务器上运行的进程有更多的控制。 情景1:http请求发送- 在这里,资源被浪费了。 情况2:http请求发送- 在这里,客户端不知道服务器中运行的进程的状态。客户端必须等待,直到它获得超文本传输协议响应。 我的想法是:在初始