【问题标题】:Akka-HTTP: How to generate a route from a List?Akka-HTTP:如何从列表生成路由?
【发布时间】:2018-08-23 21:38:52
【问题描述】:

给定List("segment1", IntNumber, "segment2"),如何生成路由?似乎没有什么好的方法可以做到这一点。我试过path(list.reduceLeft(_ / _)) 不起作用,因为它的签名是(T, T) => T

我怎样才能实现这样的目标? path(List("not", "known", "in", "advance")) -> /not/known/in/advance

编辑:

这是场景 - 一个字符串以 "something/{pathParam}/somethingElse" 出现,我希望将其转换为 "something" / Segment (or whatever value) / "somethingElse"。要获取 Segment 值,我只需将“{}”包围的整个字符串替换为该值,一旦它在列表中。

【问题讨论】:

  • list.reduceLeft(_ + "/" + _)
  • @mfirry 这不起作用,一旦将不相似的类型添加到列表中,我们就失去了类型一致性。 reduceLeft 的签名是必需的 (T, T) => T.

标签: scala akka akka-http


【解决方案1】:

您使用List("segment1", IntNumber, "segment2") 的问题是您丢失了有关单个PathMatchers 类型的信息。

val l: List[Object] = List("tmp", IntNumber, "tmp2")

使用/ 组装PathMatcher 代替组装此列表可能会更好。

【讨论】:

  • 我想要那种便利,但不幸的是,我对路线的了解不够充分(至少我认为?)你在说。我已经编辑了问题以提供进一步的见解
【解决方案2】:

构造PathMatcher

如果您将 List 构造为仅包含 PathMatcher 值:

import akka.http.scaladsl.server.PathMatcher
import akka.http.scaladsl.server.directives.PathDirectives._

val pathList : List[PathMatcher[_]] = List("segment1", IntNumber, "segment2")

然后您可以使用 fold 函数创建最终的 PathMatcher,然后可以将 path 指令应用于:

path(pathList.foldLeft(Neutral)(_ / _)) {
   ???
}

警告

但是,生成的指令类型将根据列表的内容而有所不同。问题中的示例列表将创建一个Directive1(例如Directive[(Int)]):

path(pathList.foldLeft(Neutral)(_ / _)) { (intFromPath: Int) =>

}

而不同的列表会创建一个Directive0(例如Directive[Unit]):

val otherPathList : List[PathMatcher[_]] = List("segment3", "segment4")

path(otherPathList.foldLeft(Neutral)(_ / _) {
  //no input parameter
}

因此,我不知道将 PathMatcher 元素抽象为 List 而不以某种方式动态构造将应用结果指令的函数会有多大用处。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-23
    • 2017-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多