akka-http 发送连续分块的 http 响应(流) [英] akka-http send continuous chunked http response (stream)

查看:42
本文介绍了akka-http 发送连续分块的 http 响应(流)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有这个带有 akka-http 客户端和服务器的粗略测试示例.

I have this crude test example with akka-http client and server.

Server.scala:

Server.scala:

import akka.actor.ActorSystem
import akka.stream.ActorMaterializer
import akka.stream.scaladsl.Sink
import akka.http.scaladsl.Http
import akka.http.scaladsl.model.HttpMethods._
import akka.http.scaladsl.model._
import scala.concurrent.Future

class Server extends Runnable {

    def run() = {

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

        val serverSource = Http().bind(interface = "localhost", port = 8200)

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

        val bindingFuture: Future[Http.ServerBinding] = serverSource.to(Sink.foreach { connection =>
            connection handleWithSyncHandler requestHandler
        }).run()

    }

}

Client.scala:

Client.scala:

import akka.actor.ActorSystem
import akka.http.scaladsl.Http
import akka.http.scaladsl.model.{Uri, HttpRequest}
import akka.stream.ActorMaterializer

object Client extends App {

    implicit val system = ActorSystem("client")
    import system.dispatcher

    new Thread(new Server).start()

    implicit val materializer = ActorMaterializer()
    val source = Uri("http://localhost:8200/stream")
    val finished = Http().singleRequest(HttpRequest(uri = source)).flatMap { response =>
        response.entity.dataBytes.runForeach { chunk =>
            println(chunk.utf8String)
        }
    }

}

目前Server 只回复一个测试".

At the moment Server just replies with a single "test".

如何更改 Server 中的 HttpResponse 以每 1 秒在无限循环中以分块(流)的形式发送测试"?

How do I change the HttpResponse in Server to send "test" as chunked (stream) in an endless loop every 1 second?

推荐答案

找到答案.

Server.scala:

Server.scala:

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

class Server extends Runnable {

    def run() = {

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

        val serverSource = Http().bind(interface = "localhost", port = 8200)

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

        val bindingFuture: Future[Http.ServerBinding] = serverSource.to(Sink.foreach { connection =>
            connection handleWithSyncHandler requestHandler
        }).run()

    }

}

这篇关于akka-http 发送连续分块的 http 响应(流)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆