6

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

/item/quantity

例子是

/apples/100
/bananas/200

可能的项目(例如“apples”、“bananas”、...)事先不知道,因此使用硬编码项目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]路径元素,但是我必须手动提取列表头和列表尾,这看起来很不雅。

预先感谢您的考虑和回复。

4

1 回答 1

19

因此,您可以使用修饰符组成 PathMatchers

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")

(注意那里的附加pathEnd指令;即使这样,我也不会说匹配的模式代表所有可能的情况。)

akka 路由指令

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

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

  • pathEnd指令“仅在请求路径完全匹配时才将请求传递到其内部路由。

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

于 2016-01-19T04:15:43.103 回答