Доступ к сегментам пути в akka-http из RequestContext? - PullRequest
0 голосов
/ 03 декабря 2018

Я ищу способ доступа в методе к списку сегментов пути запроса с помощью akka-http:

val route = Seq(
  path("api" / "sub" / IntNumber / IntNumber) { sub }
).reduce(_~_)

def sub(request: RequestContext): Future[RouteResult] = get {
  // how to have access to the two IntNumbers?
}(request)

Я знаю, что могу просто получить их прямов коде маршрутизации:

path("api" / "sub" / IntNumber / IntNumber) { (a, b) => sub(a, b) }
...
def sub(a: Int, b: Int)(request: RequestContext): Future[RouteResult] = get {
...

, но я хотел бы сохранить мой код маршрутизации в чистоте.

Спасибо

1 Ответ

0 голосов
/ 03 декабря 2018

Давайте упростим это визуально ...

Шаг 1:

Начнем с:

path("api" / "sub" / IntNumber / IntNumber) { (a, b) => sub(a, b) }

def sub(a: Int, b: Int)(request: RequestContext): Future[RouteResult] = ???

Не передавайте явно аргументы,Scala сделает это за вас.

Вот так:

path("api" / "sub" / IntNumber / IntNumber) { (a, b) => sub(a, b) }

Становится так:

path("api" / "sub" / IntNumber / IntNumber) { sub }

Шаг 2:

Поскольку у нас есть это определение:

type Route = RequestContext => Future[RouteResult]

Мы можем заменить эту часть (request: RequestContext): Future[RouteResult] из sub метода на Route.

Так вот:

def sub(a: Int, b: Int)(request: RequestContext): Future[RouteResult] = ???

Становится так:

def sub(a: Int, b: Int): Route = ???

Или, если вы предпочитаете этот стиль:

val sub: (Int, Int) => Route = { (a, b) => ??? }

Пример использования:

path("api" / "sub" / IntNumber / IntNumber) { sub }

def sub(a: Int, b: Int): Route = complete(s"$a / $b")

val sub: (Int, Int) => Route = { (a, b) => complete(s"$a / $b") }

Примечаниечто визуально это выглядит немного проще, но функционально и с точки зрения сигнатур типов в основном то же самое.

...