Akka HTTP中如何匹配所有路径
How to match all paths in 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
的参数是必需的,不能简单地省略。
有很多方法可以实现这一点。我相信以下显示了一些从最喜欢到最不喜欢的排序方式。
使用其他类型的指令
最简单的解决方案需要知道 Route 可以是任何 Directive, not only 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>"))
}
以上两项都提供了匹配项,因此您有额外的忽略 lambda 参数。
使用pathPrefix("")
代替path("")
根据 the documentation for path
空字符串 ""
,其行为有点像通配符,因为它始终匹配字符串。但是,path
需要完全匹配(匹配消耗整个字符串)但空字符串只会完全消耗空字符串。由于 pathPrefix
只需要匹配字符串的开头,而不是整个字符串都被消耗,因此以下工作:
val route =
pathPrefix("") {
complete(
HttpEntity(
ContentTypes.`text/html(UTF-8)`,
"<h1>Say hello to akka-http</h1>"))
}
大多数 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
的参数是必需的,不能简单地省略。
有很多方法可以实现这一点。我相信以下显示了一些从最喜欢到最不喜欢的排序方式。
使用其他类型的指令
最简单的解决方案需要知道 Route 可以是任何 Directive, not only 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>"))
}
以上两项都提供了匹配项,因此您有额外的忽略 lambda 参数。
使用pathPrefix("")
代替path("")
根据 the documentation for path
空字符串 ""
,其行为有点像通配符,因为它始终匹配字符串。但是,path
需要完全匹配(匹配消耗整个字符串)但空字符串只会完全消耗空字符串。由于 pathPrefix
只需要匹配字符串的开头,而不是整个字符串都被消耗,因此以下工作:
val route =
pathPrefix("") {
complete(
HttpEntity(
ContentTypes.`text/html(UTF-8)`,
"<h1>Say hello to akka-http</h1>"))
}