大多数Akka HTTP示例显示使用Routes
定义path
非常容易。
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
的参数是必需的,不能简单地省略。
答案 0 :(得分:8)
有很多方法可以实现。我相信以下显示了一些最受欢迎的方式。
最简单的解决方案需要知道路线可以是任何Directive,而不仅仅是path directives。
因此,可以通过完全删除path
来修改原始示例以实现所需结果:
val route =
complete(
HttpEntity(
ContentTypes.`text/html(UTF-8)`,
"<h1>Say hello to akka-http</h1>"))
PathMatcher
与path
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()