我正在寻找一种通过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 {
...
但是我想保持路由代码干净。
谢谢
答案 0 :(得分:1)
让我们在视觉上简化它...
第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") }
请注意,从外观上看,它看起来更简单一些,但在功能上和类型签名方面基本上是相同的。