2017-01-13 20 views
0

波浪號~用於連接Akka HTTP中的Route。可能還有其他應用程序,但我的動機是希望使用~運算符將一組路線變成一條路線。什麼是路由連接的標識元素或中性元素?

要做到這一點,這將有可能採取???的地方在下面的foldLeft例如「零」的元素有用:

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

所需的零將是~單位元,這將是一個什麼都不做的路由,只是將請求傳遞給串聯中的下一個路由。但是,這怎麼能代表代碼呢?

我發現了passDirective.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: _*)