繁体   English   中英

如何匹配Akka HTTP中的所有路径

[英]How to match all paths in Akka HTTP

大多数Akka HTTP示例显示使用path定义Routes非常容易。

我从介绍性示例中得到以下(略微简化),

val route =
  path("hello") {
    complete(
      HttpEntity(
        ContentTypes.`text/html(UTF-8)`,
        "<h1>Say hello to akka-http</h1>"))
  }

但是,上面只适用于“/ hello”,我想匹配所有可能的路径或URL,而不仅仅是“你好”。 空字符串""仅匹配根路径, "*"匹配文字路径“/ *”。 path的参数是必需的,不能简单地省略。

有很多方法可以实现。 我相信以下显示了一些最优先选择的方式。

使用其他类型的指令

最简单的解决方案需要知道Route可以是任何指令 ,而不仅仅是路径指令 因此,可以通过完全删除path来修改原始示例以实现所需的结果:

val route =
  complete(
    HttpEntity(
      ContentTypes.`text/html(UTF-8)`,
      "<h1>Say hello to akka-http</h1>"))

使用带path的其他PathMatcher

path实际上并不将String作为参数。 path("hello")实际上是隐式转换后的pathPrefix(_segmentStringToPathMatcher("hello")) 使用PathMatcher类型的不同参数可以获得所需的结果。

您可以使用Remaining部分。

val route =
  path(Remaining) { _ =>
    complete(
      HttpEntity(
        ContentTypes.`text/html(UTF-8)`,
        "<h1>Say hello to akka-http</h1>"))
  }

或者您可以使用正则表达式:

val route =
  path(".*".r) { _ =>
    complete(
      HttpEntity(
        ContentTypes.`text/html(UTF-8)`,
        "<h1>Say hello to akka-http</h1>"))
  }

以上两个都使匹配成为可能,因此您有另外忽略的lambda参数。

使用pathPrefix("")而不是path("")

根据path空字符串的文档"" ,它的行为有点像一个通配符,总是匹配一个字符串。 但是, path需要完全匹配(匹配消耗整个字符串),但空字符串只完全消耗空字符串。 由于pathPrefix只需要匹配字符串的开头,而不是消耗整个字符串,因此以下工作原理:

val route =
  pathPrefix("") {
    complete(
      HttpEntity(
        ContentTypes.`text/html(UTF-8)`,
        "<h1>Say hello to akka-http</h1>"))
  }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM