[英]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,而不僅僅是“你好”。 空字符串""
僅匹配根路徑, "*"
匹配文字路徑“/ *”。 path
的參數是必需的,不能簡單地省略。
有很多方法可以實現。 我相信以下顯示了一些最優先選擇的方式。
最簡單的解決方案需要知道Route可以是任何指令 ,而不僅僅是路徑指令 。 因此,可以通過完全刪除path
來修改原始示例以實現所需的結果:
val route =
complete(
HttpEntity(
ContentTypes.`text/html(UTF-8)`,
"<h1>Say hello to akka-http</h1>"))
path
的其他PathMatcher
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("")
根據path
空字符串的文檔 , ""
,它的行為有點像一個通配符,總是匹配一個字符串。 但是, path
需要完全匹配(匹配消耗整個字符串),但空字符串只完全消耗空字符串。 由於pathPrefix
只需要匹配字符串的開頭,而不是消耗整個字符串,因此以下工作原理:
val route =
pathPrefix("") {
complete(
HttpEntity(
ContentTypes.`text/html(UTF-8)`,
"<h1>Say hello to akka-http</h1>"))
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.