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
这段 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