gpt4 book ai didi

scala - 如何在Akka HTTP中匹配所有路径

转载 作者:行者123 更新时间:2023-12-04 11:20:29 25 4
gpt4 key购买 nike

大多数Akka HTTP示例都表明,使用Routes定义path确实很容易。

我从introductory example得到以下内容(略有简化),

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

但是,以上仅适用于“/hello”,我想匹配所有可能的路径或URL,而不仅仅是“hello”。空字符串 ""仅与根路径匹配,而 "*"与文字路径“/*”匹配。 path的参数是必需的,不能简单地省略。

最佳答案

有很多方法可以实现。我相信以下内容显示了一些顺序,从最高优先到最低优先。

使用其他类型的指令

最简单的解决方案需要知道Route可以是任何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>"))
}

上面的两个都使匹配可用,因此您还有其他被忽略的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>"))
}

关于scala - 如何在Akka HTTP中匹配所有路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41627005/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com