在Akka指令中提取路径头

Ram*_*gil 5 scala akka akka-stream akka-http

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

/item/quantity
Run Code Online (Sandbox Code Playgroud)

例子就是

/apples/100
/bananas/200
Run Code Online (Sandbox Code Playgroud)

可能的项目(例如"苹果","香蕉",......)事先不知道,因此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")
  }
Run Code Online (Sandbox Code Playgroud)

哪里

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

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

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

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

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

Ric*_*tze 18

您可以使用修改器组成PathMatchers从而

path(Segment / IntNumber) { case (item, qty) =>
  complete(s"item: $item quantity: $qty")
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您需要完整的突破用途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")
Run Code Online (Sandbox Code Playgroud)

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

来自akka路由指令:

  • pathPrefix指令" 适用给定的PathMatcher以消耗斜线后的剩余无与伦比的路径的前缀. "

  • path指令" 消费主导斜杠之后应用给出的PathMatcher到剩余的无与伦比的路径. "

  • pathEnd指令" 只有在请求路径已完全匹配传请求其内部的路线. "

akka路径匹配器,Segment路径匹配器" 匹配,如果不匹配的路径以路径段开始(即不是斜杠).如果是这样,路径段将被提取为String实例. "