从 RequestContext 访问 akka-http 中的路径段?

Accessing the segments of a path in akka-http out of a RequestContext?

我正在寻找一种在方法中访问带有 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 {
...

但我想保持我的路由代码干净。

谢谢

让我们直观地简化它...

第 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]

我们可以将sub方法的(request: RequestContext): Future[RouteResult]部分替换为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") }

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