0

基于此问题中描述的技术,我编写了一个基本的微服务,以使用akka-http. 相关的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 请求,单个响应的实体是 ByteString 的分块流,即每 1 秒“测试”一次。

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

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

需要一个不同的 HttpResponse 实体用于浏览器查看而不是软件客户端消费的解决方案很好(例如,如果“/stream”地址为客户端提供了一个 HttpResponse,而“/browserView”提供了一个不同的 HttpResponse,那么这是一个可以接受的答案)。

4

1 回答 1

0

I ended up following Rudiger Klaehn suggestion of using curl instead of a visual browser. Curl was able to display the chunked entity data immediately.

There must be some caching going on in the browser before the render is invoked, and my data chunks were rather small.

于 2015-11-17T20:05:50.503 回答