gpt4 book ai didi

scala - 如何在 Akka HTTP 指令中使用 Future?

转载 作者:行者123 更新时间:2023-12-01 06:28:40 24 4
gpt4 key购买 nike

我目前有一个指令,用于保护 Akka HTTP 应用程序中的资源,如下所示:

def authenticate: Directive1[Login] =
optionalHeaderValueByName("Authorization") flatMap {
val accessToken = authz.split(' ').last
case Some(authz) =>
LoggedInUser findByAccessToken accessToken match {
case Some(user) => provide(user)
case None => reject(AuthorizationFailedRejection)
}
case None => reject(AuthorizationFailedRejection)
}

哪里 LoggedInUser.findByAccessToken()对数据库进行阻塞查询,我想将其切换为异步 ask对于可以提供相同数据的 Actor ,我可以传递 ActorRef作为指令的参数,但我不知道如何处理 Future问返回。
Directive1 都没有Akka HTTP 附带的示例似乎可以做到这一点(至少我找不到),尽管有返回 Route 的指令的示例。哪个做。

我想要做的甚至可能吗?是一种可能的方法来创建 StandardRoute带有用户凭据字段的子类并以某种方式返回?

最佳答案

对的,这是可能的。据我了解,您需要这样的东西:

def authenticate: Directive1[Login] = {
def findByAccessToken(accessToken:String): Future[Option[Login]] = ???
optionalHeaderValueByName("Authorization").flatMap {
case Some(authz) =>
val accessToken = authz.split(' ').last
onSuccess(findByAccessToken(accessToken)).flatMap {
case Some(user) => provide(user)
case None => reject(AuthorizationFailedRejection)
}
case None => reject(AuthorizationFailedRejection)
}
}

关于scala - 如何在 Akka HTTP 指令中使用 Future?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33040241/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com