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

/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]路径元素,但我必须手动提取列表头和列表尾,这似乎不雅。
预先感谢您的考虑和回应。

请您参考如下方法:

您可以 compose PathMatchers with modifiers因此

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 routing directives :
  • pathPrefix指令“在使用前导斜杠后,将给定的 PathMatcher 应用于剩余的不匹配路径的前缀。”
  • path指令“在使用前导斜杠后将给定的 PathMatcher 应用到剩余的不匹配路径。”
  • pathEnd指令“如果请求路径完全匹配,则仅将请求传递到其内部路由。”

  • 来自 akka path-matchers , Segment路径匹配器“如果不匹配的路径以路径段开头(即不是斜杠),则匹配。如果是,则路径段被提取为字符串实例。”


    评论关闭
    IT干货网

    微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!