大多数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>"))
使用不同的PathMatcher
和path
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>"))
}