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

时间:2017-01-13 03:36:49

标签: scala akka-http

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

我从introductory example

获得以下(略微简化)
val route =
  path("hello") {
    complete(
      HttpEntity(
        ContentTypes.`text/html(UTF-8)`,
        "<h1>Say hello to akka-http</h1>"))
  }

但是,以上仅适用于&#34; / hello&#34;我希望匹配所有可能的路径或URL,而不仅仅是&#34;你好&#34;。空字符串""仅匹配根路径,"*"匹配文字路径&#34; / *&#34;。 path的参数是必需的,不能简单地省略。

1 个答案:

答案 0 :(得分:8)

有很多方法可以实现。我相信以下显示了一些最受欢迎的方式。

使用其他类型的指令

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

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

使用PathMatcherpath

不同的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>"))
  }

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

pathPrefix("")

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

使用path("")代替""

根据the documentation for path空字符串path,它的行为有点像通配符,它​​总是与字符串匹配。但是,pathPrefix需要完全匹配(匹配消耗整个字符串),但空字符串仅完全使用空字符串。由于val route = pathPrefix("") { complete( HttpEntity( ContentTypes.`text/html(UTF-8)`, "<h1>Say hello to akka-http</h1>")) } 只需要匹配字符串的开头,而不是消耗整个字符串,因此以下工作:

.map()