基于此问题中描述的技术,我编写了一个基本的微服务,以使用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,那么这是一个可以接受的答案)。