如何匹配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,而不仅仅是"hello"。空字符串""仅与根路径匹配,"*"与文字路径"/*"匹配。path的参数是必需的,不能简单地省略。

有很多方法可以实现这一点。我相信以下显示了一些按最优先顺序排列的方式。

使用其他类型的指令

最简单的解决方案需要知道路由可以是任何指令,而不仅仅是路径指令。因此,只需完全删除path即可修改原始示例以获得所需结果:

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

使用不同的PathMatcherpath

CCD_ 9实际上并不将CCD_。CCD_ 11实际上是隐式转换后的CCD_。使用类型为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>"))
}

最新更新