将两条路线合二为一

时间:2018-04-24 20:07:21

标签: akka akka-http

让我们考虑一个简化的例子。

def routes: Route = {
  pathPrefix("parent" / IntNumber) { (id) =>
    get {
      complete(id)
    } ~
    pathPrefix("child") { // this would be in separate file
      get {
        complete(s"parent/$id/child")
      }
    }
  }
}

我需要的是放

def childRoutes: Route = {
  pathPrefix("child") {
    get {
      complete(s"parent/$id/child")
    }
  }
}

进入一个单独的文件并将其组合成父路由,但我不知道如何从父路由传播变量id

1 个答案:

答案 0 :(得分:1)

路线是功能

使用akka-http时要记住的一件事是Route只是一个函数,from the documentation

type Route = (RequestContext) ⇒ Future[RouteResult]

因此,您可以创建一个更高阶的函数来实例化childRoute

//Child.scala
val childRoute : (Int) => Route = 
  (id) => pathPrefix("child") {
    get {
      complete(s"parent/$id/child")
    }
  }

现在可以与父母一起编写:

//Parent.scala
val routes: Route = 
  pathPrefix("parent" / IntNumber) { (id) =>
    get{
      complete(id)
    } ~ childRoute(id)
  }

路线不一致

作为旁注:永远不会到达您的孩子路线。由于您与孩子一起编写了get { complete(id) },并且还有get,因此您将始终返回complete(id)。请求永远不会达到complete(s"parent/$id/child")