使用 angularjs $http 处理分块响应

Posted

技术标签:

【中文标题】使用 angularjs $http 处理分块响应【英文标题】:Process chunked response with angularjs $http 【发布时间】:2012-10-21 14:24:15 【问题描述】:

我发现了最近的分块响应。 我同意大多数时候我们希望做出全面的回应。 但是,如果我想处理分块响应怎么办。

我将如何使用 $http 服务做到这一点?

【问题讨论】:

您可能需要使用 $httpInterceptor 创建自己的服务。你有分块响应的样本吗? 通常是 json 对象,由 \n 分隔你有这样使用 $httpInterceptor 的例子吗? 对不起,我说错了,不一定是服务,而是可以将多个响应组合在一起的魔法。 ...但听起来您有 一个 响应,其中包含许多 JSON 部分? 没错。我的想法是在收到每个 json 对象后立即使用它们。我提出这个想法,因为要生成和检索的对象列表很长。 为什么不将每个卡盘放入一个主 JSON 对象中,像字典一样使用它? 'part1': , 'part2': ...然后您可以编写一个服务或为您提供的东西并将其拆分为适当的部分。 【参考方案1】:

您可以使用包装 XMLHttpRequest 的 angularjs 承诺 $q 定义一个函数。

var chunkedRequestWithPromise = function () 
  var deferred = $q.defer();
  var xhr = new XMLHttpRequest()
  xhr.open("GET", 'https://yoururl.com/chunked', true)
  xhr.onprogress = function () 
    deferred.notify(xhr.responseText);
  
  xhr.onreadystatechange = function (oEvent) 
    if (xhr.readyState === 4) 
        if (xhr.status === 200) 
            deferred.resolve('success');
         else 
            deferred.reject(xhr.statusText);
        
    
  ;
  xhr.send();
  return deferred.promise;
;

并使用它:

chunkedRequestWithPromise().then(successFn,errorFn,notifyFn);

【讨论】:

【参考方案2】:

我找到了一种方法来做一些我认为正确的事情 http://www.igvita.com/2011/08/26/server-sent-event-notifications-with-html5/

当然还有 websocket api,但它对我的使用来说很重

另一种可能性是编写另一个 http 服务来控制 http 响应

【讨论】:

IE 目前不支持 EventSource。 感谢通知,我会继续寻找替代方案

以上是关于使用 angularjs $http 处理分块响应的主要内容,如果未能解决你的问题,请参考以下文章

akka-http 分块响应连接

AngularJs HTTP响应拦截器实现登陆权限校验

如何使用 Proxygen 和 Folly 发送 HTTP 分块响应以模拟视频流?

Angularjs 如何对 $http 调用进行正确的错误处理?

akka-http 发送连续的分块 http 响应(流)

使用 NancyFX 自托管分块压缩响应