scala - 从 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 {
...
但我想保持我的路由代码干净。
谢谢
解决方案
让我们在视觉上简化它...
步骤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") }
请注意,它在视觉上看起来有点简单,但在功能上,就类型签名而言,它基本上是相同的。
推荐阅读
- javascript - 根据对象属性的前 3 个单词从对象数组中删除重复项
- python - 过滤小时差 - pandas
- sql - 如何根据同一张表的不同条件计算并返回 1 个 sql 查询中的 sum 和 count?
- arrays - 给定某些条件,为数组元素赋值
- .net-core - Azure DevOps 管道 DotNetCore 测试路径项目模式
- go - Google Cloud Monitoring - 警报政策:状态代码:409 - 对项目配置的并发编辑过多
- javascript - 使用花括号导出时无法测试
- javascript - 使用 JavaScript 扩展 HTML 单选按钮
- javascript - Onload Function Not Triggering Function,没有控制台错误
- javascript - 在 Google Chrome 中使用 javascript 关闭当前选项卡