如何将URI中的路径段与Akka-http低级API进行匹配

时间:2016-12-26 16:28:42

标签: scala rest akka-http

我正在尝试使用akka-http低级API实现REST API。我需要匹配包含资源ID的路径请求,例如“/ users / 12”,其中12是用户的id。

我正在寻找这些方面的东西:

case HttpRequest(GET, Uri.Path("/users/$asInt(id)"), _, _, _) =>
   // id available as a variable

“$ asInt(id)”是一个组合语法,我用它来描述我想要做的事情。

我可以使用路由和指令轻松找到如何使用高级API执行此操作的examples,但我找不到任何低级API。这是否可以使用低级API?

2 个答案:

答案 0 :(得分:2)

我在Akka用户列表中发现一条帖子说低级API不支持这种类型的路径段提取:

https://groups.google.com/forum/#!topic/akka-user/ucXP7rjUbyE/discussion

替代方法是使用路由API或自己解析路径字符串。

答案 1 :(得分:1)

我的团队找到了一个很好的解决方案:

/** matches to "/{head}/{tail}" uri path, where tail is another path */
object / {
  def unapply(path: Path): Option[(String, Path)] = path match {
    case Slash(Segment(element, tail)) => Some(element -> tail)
    case _ => None
  }
}

/** matches to last element of the path ("/{last}") */
object /! {
  def unapply(path: Path): Option[String] = path match {
    case Slash(Segment(element, Empty)) => Some(element)
    case _ => None
  }
}

示例用法(期望路径为“/ event / $ {eventType}”)

val requestHandler: HttpRequest => Future[String] = {
  case HttpRequest(POST, uri, _, entity, _)  =>
      uri.path match {
        case /("event", /!(eventType)) =>
        case _ =>
     }
  case _ =>
}

通过将对/的调用链接起来,以/!调用结束,可以处理更复杂的方案。