2017-01-13 2 views
0

Тильда, ~ Используется для объединения Route s в Akka HTTP. Могут быть другие приложения, но мой мотивирующий случай хочет превратить коллекцию маршрутов в один маршрут с помощью оператора ~.Что такое элемент идентификации или нейтральный элемент для конкатенации маршрута?

Чтобы сделать это, было бы полезно иметь элемент «нулевой», которые могли бы занять место в ??? в foldLeft примере ниже:

val routes: Seq[Route] = ... 
val route = routes.foldLeft[Route](???)(_ ~ _) 

Необходимый ноль будет единичный элемент для ~ , который будет маршрутом, который ничего не сделал, просто передал запрос на следующий маршрут в конкатенации. Однако как это можно представить в коде?

Я нашели Directive.Empty директивы, но оба из них обертывают внутренний маршрут и не могут быть самим маршрутом. Они - Директивы, которые могут обернуть Маршрут, в то время как мне нужен Route.

ответ

1

Маршруты в цепочке конкатенации продолжают обработку, пока Маршруты отклоняют запрос. Если первый маршрут отклоняет запрос, следующий будет проверен. Это продолжается до тех пор, пока не будет больше маршрутов или маршрут примет запрос (завершение цепи конкатенации).

Учитывая, что идентификационный маршрут, который вы идентифицируете, должен был бы отклонить каждый запрос. The built-in RouteDirective reject делает именно это. Ваш код будет:

val routes: Seq[Route] = ... 
routes.foldLeft[Route](reject)(_ ~ _) 

Примечание: Ваш конкретный вариант использования уже предусмотрен для использования Akka HTTP. Вместо того, чтобы самостоятельно писать fold, вы можете просто использовать встроенный RouteConcatenation.concat следующим образом:

val routes: Seq[Route] = ... 
val route = concat(routes: _*) 
Смежные вопросы