akka http完成或基于未来的重定向。

问题描述 投票:1回答:1

这段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-http
1个回答
0
投票

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。

© www.soinside.com 2019 - 2024. All rights reserved.