3

外部サービスを使用して 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

4

1 に答える 1