Akka-HTTP:使用Flow完成请求

10
假设我已经设置了一个任意复杂的Flow [HttpRequest,HttpResponse,Unit]。 我已经可以使用这个流来处理传入的请求。
Http().bindAndHandle(flow, "0.0.0.0", 8080)

现在我想要添加日志记录,利用一些现有的指令,比如logRequestResult("my-service"){...}。是否有一种方法将这个指令与我的流程结合起来?我想我正在寻找另一个指令,类似于...


def completeWithFlow(flow: Flow): Route

这真的可能吗?

N.B.:logRequestResult只是一个例子,我的问题适用于任何您可能发现有用的指令。


为什么日志记录必须由指令提供?为什么不能只使用Flow.log? - Ramón J Romero y Vigil
是的,我可以在这个特定的例子中使用Flow.log。我的问题有点更通用,比如说:如果我有一个可重用的指令,我想要利用它,那么我该怎么做呢?比如说,我想要利用下面的指令来处理 .favicon 请求:path("favicon.ico") { getFromResource("favicon.ico", image/x-icon) }我希望能够将这个指令与我的流程结合起来使用,例如使用我的流程来服务于一个特定的路径,并使用上述指令来服务于 /favicon。 - Stefano Bonetti
2个回答

7
原来唯一的方法是连接并实现一个新的流程,并将提取的请求传送给它。下面是示例。
  val myFlow: Flow[HttpRequest, HttpResponse, NotUsed] = ???

  val route =
    get {
      logRequestResult("my-service") {
        extract(_.request) { req ⇒
          val futureResponse = Source.single(req).via(myFlow).runWith(Sink.head)
          complete(futureResponse)
        }
      }
    }

  Http().bindAndHandle(route, "127.0.0.1", 9000)

这在2019年仍然是现状吗? - shay__

0

谢谢,实际上我正在寻找相反的东西。 - Stefano Bonetti
2
总是很高兴能够帮助别人...也许是某个人... - tacos_tacos_tacos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接