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

时间:2018-12-02 23:07:51

标签: scala 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 {
...

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

谢谢

1 个答案:

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

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