将两条路线组成一条



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

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

路由是函数

使用Akka-http时要记住的一件事是Route只是一个函数,来自文档:

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")将永远不会通过请求达到。

最新更新