Route Concatenation的标识元素或中性元素是什么?

时间:2017-01-13 18:22:24

标签: scala akka-http

代字号~用于在Akka HTTP中连接Route。可能还有其他应用程序,但我的动机是希望使用~运算符将路径集合转换为单个路径。

要做到这一点,有一个"零"可替代下面???示例中foldLeft的元素:

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

所需的零将是~的标识元素,它将是一个什么都不做的路由,只是将请求传递给串联中的下一个路由。但是,如何在代码中表示它?

我找到了passDirective.Empty指令,但这两个指令都包含内部路由,而不能自己成为路由。它们是可以包裹路线的指令,而我自己需要Route

1 个答案:

答案 0 :(得分: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: _*)