Составьте два маршрута в один - PullRequest
0 голосов
/ 24 апреля 2018

Давайте рассмотрим упрощенный пример.

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 голосов
/ 25 апреля 2018

Маршруты являются функциями

При работе с 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") никогда не будет достигнут запросом.

...