在RequestContext之外访问akka-http中的路径段



我正在寻找一种方法,用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") }

请注意,从视觉上看,它看起来有点简单,但功能上和类型签名方面基本相同。

最新更新