外部サービスを使用して IP アドレスであることをユーザーに伝えるエンドポイントを Akka Http Server に作成しようとしています (これは簡単に実行できることはわかっていますが、これは挑戦として行っています)。
最上層でストリームを使用しないコードは次のとおりです。
implicit val system = ActorSystem()
implicit val materializer = ActorMaterializer()
val requestHandler: HttpRequest => Future[HttpResponse] = {
case HttpRequest(GET, Uri.Path("/"), _, _, _) =>
Http().singleRequest(HttpRequest(GET, Uri("http://checkip.amazonaws.com/"))).flatMap { response =>
response.entity.dataBytes.runFold(ByteString(""))(_ ++ _) map { string =>
HttpResponse(entity = HttpEntity(MediaTypes.`text/html`,
"<html><body><h1>" + string.utf8String + "</h1></body></html>"))
}
}
case _: HttpRequest =>
Future(HttpResponse(404, entity = "Unknown resource!"))
}
Http().bindAndHandleAsync(requestHandler, "localhost", 8080)
そしてそれはうまくいっています。ただし、課題として、ストリームのみを使用するように制限したいと思いました (noFuture
の)。
これは、この種のアプローチに使用すると考えたレイアウトです
。Source[Request] -> Flow[Request, Request] -> Flow[Request, Response] ->Flow[Response, Response]
また、404 ルートに対応するためにもSource[Request] -> Flow[Request, Response]
. さて、もし私の Akka Stream の知識が役立つのであれば、Flow.fromGraph
そのようなことには a を使用する必要がありますが、ここで行き詰まっています。
さまざまなFuture
エンドポイントに対して簡単なマップと flatMap を実行できますが、ストリームでは、フローを複数のフローに分割することを意味し、それをどのように行うかはよくわかりません。UnzipWith と Options または一般的なブロードキャストを使用することを考えました。
この件に関するヘルプは大歓迎です。
これが必要な場合はしませんか?-- http://doc.akka.io/docs/akka-stream-and-http-experimental/2.0-M2/scala/stream-customize.html