akka http complete 或 redirect based on a future

akka http complete or redirect based on a future

这段 akka http 服务器代码片段有效:

path("test") {
  if (shouldRedirect())
    redirect(redirectUrl, StatusCodes.PermanentRedirect)
  else
    complete("hello")
}

然而,我的 shouldRedirect() return 是一个 Future[Boolean]。我需要这样的东西,但是这里不允许 returning Future。

path("test") {
  futureShouldRedirect().map { shouldRedirect =>
    if (shouldRedirect)
      redirect(redirectUrl, StatusCodes.PermanentRedirect)
    else
      complete("hello")
    }
  }
}

如何解决? ps:我知道完整函数在内部接受 Future,但是在这种情况下这没有用,我需要 return 完整或重定向。

Akka 提供了预定义的指令,您可以使用它来解决同样的问题。

https://doc.akka.io/docs/akka-http/current/routing-dsl/directives/

使用 onComplete Future 指令的解决方案:

import akka.http.scaladsl.server.directives._

path("test") {
  onComplete(shouldRedirect()) {
    case Success(true)  => redirect(redirectUrl, StatusCodes.PermanentRedirect)
    case Success(false) => complete("hello")
    case Failure(ex) =>
      complete((InternalServerError, s"An error occurred: ${ex.getMessage}"))
  }
}

如果您的 shouldRedirect 失败,上述解决方案将处理成功和失败的情况。

https://doc.akka.io/docs/akka-http/current/routing-dsl/directives/future-directives/onComplete.html

使用 onSuccess 未来指令的解决方案:

import akka.http.scaladsl.server.directives._

path("test") {
  onSuccess(shouldRedirect()) { isRedirect =>
    {
      if (isRedirect) redirect(redirectUrl, StatusCodes.PermanentRedirect)
      else complete("hello")
    }
  }
}

以上解决方案将只处理成功的情况,如果失败,它将冒泡到异常处理程序(如果您已定义),否则到默认异常处理程序。

https://doc.akka.io/docs/akka-http/current/routing-dsl/directives/future-directives/onSuccess.html