Web浏览器查看分块的http实体数据流

时间:2015-10-26 13:07:51

标签: html web-services scala http-streaming akka-http

基于所描述的技术at this question,我编写了一个基本的微服务,使用akka-http提供连续流式ByteStrings。相关的scala代码是:

import akka.actor.ActorSystem
import akka.stream.ActorMaterializer
import akka.stream.scaladsl.{Source, Flow}
import akka.http.scaladsl.Http
import akka.http.scaladsl.model.HttpEntity
import akka.http.scaladsl.model.HttpMethods._
import akka.http.scaladsl.model._
import scala.concurrent.Future
import scala.concurrent.duration._

object Server extends App {

  implicit val system = ActorSystem("testServer")
  implicit val materializer = ActorMaterializer()

  val strToChunk = 
    Flow[String].map(ByteString(_))
                .via(Flow[ByteString].map(HttpEntity.ChunkStreamPart(_)))      

  def sourceFactory = 
    Source(0 seconds, 1 seconds,"test").via(strToChunk)

  val requestHandler: HttpRequest => HttpResponse = {
    case HttpRequest(GET, Uri.Path("/stream"), _, _, _) =>
      HttpResponse(entity = HttpEntity.Chunked(ContentTypes.`text/plain`,
                                               sourceFactory))                 
  }

  val bindingFuture = 
    Http().bind(interface = "localhost", port = 8200).runForeach { conn =>
      conn handleWithSyncHandler requestHandler
  }
}

客户端发出单个http请求,而单个响应的实体是ByteStrings的分块流,即" test"每1秒钟。

我验证了流产生"测试"使用scala客户端的值。但是,一个非常方便的调试方法是指向微服务中的Web浏览器,以便在数据进入时查看Chunk流。我尝试将我的chrome浏览器指向端口,但浏览器只是挂在加载/忙碌状态。

所以,我的问题是:如何修改HttpResponse以便浏览器能够实时显示流?

需要不同的HttpResponse实体进行浏览器查看而不是软件客户端消费的解决方案很好(例如,如果" / stream"地址为客户端和" / browserView&#34提供了HttpResponse ;提供不同的HttpResponse然后这是一个可接受的答案)。

1 个答案:

答案 0 :(得分:0)

我最后跟随Rudiger Klaehn建议使用curl而不是视觉浏览器。 Curl能够立即显示分块的实体数据。

在调用渲染之前,浏览器中必定会有一些缓存,而且我的数据块相当小。