假设我有一个文件夹foo
,其中包含index.html
个文件,以及下面的Akka HTTP服务器代码如下:
object Server extends App {
val route: Route =
pathPrefix("foo") {
getFromDirectory("foo")
}
Http().bindAndHandle(route, "0.0.0.0", 8080)
}
如果我在浏览器中打开index.html
,则会正确提供 http://localhost:8080/foo/index.html
,但如果我打开http://localhost:8080/foo
或http://localhost:8080/foo/
则不会。
如果有可能,默认情况下如何设置我的Akka HTTP路由以在该位置提供index.html
个文件?
我知道我可以做到以下几点:
val route: Route =
path("foo") {
getFromFile("foo/index.html")
} ~
pathPrefix("foo") {
getFromDirectory("foo")
}
可是:
http://localhost:8080/foo
生效,而不是http://localhost:8080/foo/
foo/bar/index.html
文件,问题就会一样。答案 0 :(得分:2)
您可以使用Route
指令创建您要查找的pathEndOrSingleSlash
:
val route =
pathPrefix("foo") {
pathEndOrSingleSlash {
getFromFile("foo/index.html")
} ~
getFromDirectory("foo")
}
此路线将在路径末尾匹配并提供index.html,或者如果结尾不匹配,则会调用getFromDirectory。
如果你想让这个“全球化”,你可以用它来创造一个功能:
def routeAsDir[T](pathMatcher : PathMatcher[T], dir : String) : Route =
pathPrefix(pathMatcher) {
pathEndOrSingleSlash {
getFromFile(dir + "/index.html")
} ~
getFromDirectory(dir)
}
然后可以使用
调用它val barRoute = routeAsDir("foo" / "bar", "foo/bar")
功能性Akka Http
旁注:您的代码完全正常运行。 Directives DSL的优雅可能有点误导,并说服你,你不小心误入了命令式编程风格。但是每个指令都只是一个功能;不能比那更具“功能性”...