首页 > 解决方案 > 如何在 Akka Http 中以编程方式调用 Route

问题描述

在 Akka Http 中,可以通过这种方式定义路由系统来管理 REST 基础设施,如下所述:https ://doc.akka.io/docs/akka-http/current/routing-dsl/overview.html

val route =
      get {
        pathSingleSlash {
          complete(HttpEntity(ContentTypes.`text/html(UTF-8)`,"<html><body>Hello world!</body></html>"))
        } ~
          path("ping") {
            complete("PONG!")
          } ~
          path("crash") {
            sys.error("BOOM!")
          }
      }

有没有办法以类似于以下语句的方式以编程方式调用同一应用程序中的一个路由?

val response = (new Invoker(route = route, method = "GET", url = "/ping", body = null)).Invoke()

Response远程 HTTP 调用服务的相同结果在哪里?

前面提到的 API 只是为了说明我的想法,我希望能够设置内容类型、标题等。

标签: scalaakka-http

解决方案


最后,我通过在 Akka HTTP 文档中挖掘更多内容,设法找到了我自己问题的答案。

如此处所述:https://doc.akka.io/docs/akka-http/current/routing-dsl/routes.html,这Route是一种定义如下:

type Route = RequestContext => Future[RouteResult]

RequestContext的包装器在哪里HttpRequest。但是,aRoute可以隐式或不隐式地转换为其他函数类型也是如此,如下所示:

def asyncHandler(route: Route)(...): HttpRequest ⇒ Future[HttpResponse]

因此,确实可以通过将路由转换为另一种函数类型来“调用”路由,然后简单地传递一个HttpRequest构建 ad hoc,接收包含所需响应的 Future。转换需要的时间比其他操作多一点,但这是可以在引导应用程序时完成的。

注意:转换需要这些导入,如此处所述:https ://doc.akka.io/docs/akka-http/current/introduction.html

implicit val system = ActorSystem("my-system")
implicit val materializer = ActorMaterializer()
implicit val executionContext = system.dispatcher

但是这些导入对于创建服务本身已经是强制性的。


推荐阅读