我正在尝试使用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?
答案 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 _ =>
}
通过将对/
的调用链接起来,以/!
调用结束,可以处理更复杂的方案。