Akka-HTTP:如何从List生成路由?

时间:2017-09-16 03:32:35

标签: scala akka akka-http

给定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值,我只是替换" {}"所包围的整个字符串。一旦它在列表中,使用该值。

2 个答案:

答案 0 :(得分:0)

使用T时遇到的问题是您丢失了有关单let a: [Int] = [1,2,3] let b: [CustomStringConvertible] = [1, "XYZ"] a.index(of: 2) // 1 b.index(of: "XYZ") // error 个类型的信息。

List("segment1", IntNumber, "segment2")

通过使用PathMatcher组装val l: List[Object] = List("tmp", IntNumber, "tmp2") 代替汇总此列表,您可能会感觉更好。

答案 1 :(得分:0)

构造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元素抽象到列表中而又不动态构建最终指令将要应用的功能的有用性。