Akka-Http загружает css&js ресурсы
Я хочу использовать akka-http как http-сервер (например, tomcat или nginx server) .
с помощью этого простого кода можно загружать HTML-источники из веб-браузеров, но не может загружать другие источники, связанные с HTML-файлом.
import akka.actor.ActorSystem
import akka.http.scaladsl.Http
import akka.http.scaladsl.server.Directives._
import akka.stream.ActorMaterializer
import scala.io.StdIn
object MainRunner extends App {
implicit val system = ActorSystem("mySystem")
implicit val materializer = ActorMaterializer()
implicit val ec = system.dispatcher
val staticResources =
get {
path("admin") {
getFromResource("admin/index.html")
} ~ pathPrefix("admin") {
getFromResourceDirectory("admin")
}
}
val bindingFuture = Http().bindAndHandle(staticResources, "localhost", 8080)
println(s"Server online at http://localhost:8080/\nPress RETURN to stop...")
StdIn.readLine() // let it run until user presses return
bindingFuture
.flatMap(_.unbind()) // trigger unbinding from the port
.onComplete(_ => system.terminate()) // and shutdown when done
}
это мой HTML-файл:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="main.css">
</head>
<body>
<h1>Admin area</h1>
</body>
</html>
и получите эту ошибку в браузере: Это структура каталогов:
Как можно решить эту проблему?
2 ответа
Решение
Вам понадобится ваш маршрут, чтобы добавить косую черту при попадании на пути статических ресурсов. redirectToTrailingSlashIfMissing
Директива должна сделать свое дело:
import akka.http.scaladsl.model.StatusCodes
val staticResources =
(get & pathPrefix("admin")){
(pathEndOrSingleSlash & redirectToTrailingSlashIfMissing(StatusCodes.TemporaryRedirect)) {
getFromResource("admin/index.html")
} ~ {
getFromResourceDirectory("admin")
}
}
Вам нужна следующая директива
get {
getFromResourceDirectory("admin")
}