基于所描述的技术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然后这是一个可接受的答案)。
答案 0 :(得分:0)
我最后跟随Rudiger Klaehn建议使用curl而不是视觉浏览器。 Curl能够立即显示分块的实体数据。
在调用渲染之前,浏览器中必定会有一些缓存,而且我的数据块相当小。