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

vos*_*d01 7 scala akka-http

大多数阿卡HTTP例子表明它是很容易定义Routes使用 path.

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

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

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

vos*_*d01 9

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

使用其他类型的指令

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

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

使用不同PathMatcherpath

path实际上不会将a 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>"))
  }
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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