将index.html视为Akka HTTP的getFromDirectory中的默认文件

时间:2017-03-18 06:03:58

标签: scala akka-http

假设我有一个文件夹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/foohttp://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文件,问题就会一样。

1 个答案:

答案 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的优雅可能有点误导,并说服你,你不小心误入了命令式编程风格。但是每个指令都只是一个功能;不能比那更具“功能性”...