首页 > 解决方案 > 从 RequestContext 中访问 akka-http 中的路径段?

问题描述

我正在寻找一种方法来使用 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 {
...

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

谢谢

标签: scalaakka-http

解决方案


让我们在视觉上简化它...

步骤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]为.subRoute

所以这:

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") }

请注意,它在视觉上看起来有点简单,但在功能上,就类型签名而言,它基本上是相同的。


推荐阅读