在Akka指令中提取路径头

时间:2016-01-18 20:59:47

标签: scala akka akka-stream akka-http

我正在使用akka directives来匹配特定的路径模式:

/item/quantity

例子是

/apples/100
/bananas/200

事先不知道可能的项目(例如“苹果”,“香蕉”......),因此使用path对项目进行硬编码不是一种选择。

但是,我找不到提取路径头部的PathMatcher。我正在寻找形式的东西

val route = 
  get {
    path(PathHeadAsString) { item : String =>
      path(IntNumber) { qty : Int =>
        complete(s"item: $item quantity: $qty")
      } ~ complete("no quantity specified")
    } ~ complete("no item specified")
  }

其中

Get("/apples/100") ~> route ~> check {
  responseAs[String] shouldEqual "item: apples quantity: 100"
}

有没有办法提取路径的第一段?

如果数量在路径中,path(segment)匹配器将不匹配。

我显然可以使用path(segments)来获取路径元素的List[String],但是我必须手动提取列表头和列表尾部,这似乎是不优雅的。

提前感谢您的考虑和回应。

1 个答案:

答案 0 :(得分:17)

你可以compose PathMatchers with modifiers

(alt!
  [c t]        ; "Takes" can be a single channel instead of vectors.
  ([val ch]
    (foo ch val))

  [[out input-val]] ; "Puts" must be nested vectors.
  ([val ch]
    (bar ch val)))

如果您需要完整分组,请使用path(Segment / IntNumber) { case (item, qty) => complete(s"item: $item quantity: $qty") }

pathPrefix

(注意那里的附加val route = pathPrefix(Segment) { item : String => path(IntNumber) { qty : Int => complete(s"item: $item quantity: $qty") } ~ pathEnd { complete("no quantity specified") } ~ complete("something else going on here") } ~ complete("no item specified") 指令;即便如此,我也不会说匹配的模式代表所有可能的情况。)

来自akka routing directives

  • pathEnd指令“在使用前导斜杠后,将给定的PathMatcher应用于剩余不匹配路径的前缀。

  • pathPrefix指令“在使用前导斜杠后,将给定的PathMatcher应用于剩余的不匹配路径。

  • path指令“如果请求路径已完全匹配,则仅将请求传递给其内部路由。

akka path-matchers开始,pathEnd路径匹配器“匹配,如果不匹配的路径以路径段开头(即不是斜杠)。如果是,则将路径段提取为String实例