这段akka http服务器的代码可以用,但我的shouldRedirect()却返回一个Future[Boolean]。
path("test") {
if (shouldRedirect())
redirect(redirectUrl, StatusCodes.PermanentRedirect)
else
complete("hello")
}
然而,我的shouldRedirect()返回一个Future[Boolean]. 我需要这样的东西,但这里不允许返回一个Future。
path("test") {
futureShouldRedirect().map { shouldRedirect =>
if (shouldRedirect)
redirect(redirectUrl, StatusCodes.PermanentRedirect)
else
complete("hello")
}
}
}
如何解决这个问题?我知道完整函数内部可以接受一个Future,但是在这种情况下,我需要返回一个完整函数或者一个重定向函数,这并没有用。
Akka提供了预定义的指令,使用这些指令你可以解决同样的问题。
https:/doc.akka.iodocsakka-httpcurrentrouting-dsldirectives。
使用onComplete未来指令的解决方案。
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.iodocsakka-httpcurrentrouting-dsldirectivesfuture-directivesonComplete.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.iodocsakka-httpcurrentrouting-dsldirectivesfuture-directivesonSuccess.html。