Как вы используете PathMatcher с pathPrefix для перенаправления URL-адреса пути к /index.html в akka-http 10? - PullRequest
0 голосов
/ 25 февраля 2020

Я использую akka-http 10.0.10 и имею следующий файл (я извлек его в один файл, чтобы немного сузить импорт, но проблема та же):

import akka.http.scaladsl.model.StatusCodes
import akka.http.scaladsl.server._
import akka.http.scaladsl.server.Directives._

object RouteHelpers {

  def indexRoute(dir : String): Route =
    pathEndOrSingleSlash {
      getFromFile(dir + "/index.html")
    } ~
    getFromDirectory(dir)

  def routeAsDir[T](pathMatcher : PathMatcher[T], dir : String) : Route =
    pathPrefix(pathMatcher)(indexRoute(dir))
}

Это приводит к ошибке:

RouteHelpers.scala:15:28: akka.http.scaladsl.server.Directive[T] does not take parameters
[error]     pathPrefix(pathMatcher)(indexRoute(dir))

Исходная ссылка для этого { ссылка }.

1 Ответ

0 голосов
/ 01 марта 2020

Я думаю, что основная причина этой ошибки - шаблон ma gnet. Если вы используете pathPrefix(pathMatcher)(indxRoute(dir)), то блок (indxRoute(dir)) принимается за неявный аргумент pathPrefix. pathPrefix возвращает директиву типа Directive[T], а класс Directive не принимает никаких неявных параметров и, следовательно, ошибки.

Возможные решения:

с использованием метода tapply

tapply метод - это специальный метод, присутствующий в классе Directive. tapply вызывает внутренний маршрут с набором извлеченных значений типа T, как показано в следующем примере кода:

def routeAsDir[T](pathMatcher: PathMatcher[T], dir: String): Route = {
  pathPrefix(pathMatcher).tapply(t => indexRoute(dir))
}

Альтернативный подход

def routeAsDir[T](pathMatcher: PathMatcher[T]): Directive[T] = pathPrefix(pathMatcher)

Используйте эту функцию для Директива get и используйте эту директиву для построения маршрута, как показано ниже:

val matcher: PathMatcher[Unit] = "foo" / "bar"
val route: Route = routeAsDir(matcher) {
    indexRoute("foo/bar")
}

Это решение работает, потому что routeAsDir(matcher) возвращает Directive[Unit] или Directive0, для которого метод apply вызывается с внутренними маршрутами.

Дайте мне знать, если это поможет!

...