我正在寻找一种方法,用akkahttp:访问请求路径的段列表
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:
开始:
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]
我们可以用Route
代替sub
方法的(request: RequestContext): Future[RouteResult]
部分。
所以这个:
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") }
请注意,从视觉上看,它看起来有点简单,但功能上和类型签名方面基本相同。