【问题标题】:How can I use a Future inside an Akka HTTP Directive?如何在 Akka HTTP 指令中使用 Future?
【发布时间】:2015-10-09 14:00:20
【问题描述】:

我目前有一个指令用于保护 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 切换为可以提供相同数据的参与者,我可以将 ActorRef 传递为指令的参数,但我不知道如何处理请求返回的Future

Akka HTTP 附带的 Directive1 示例似乎都没有这样做(至少我找不到),尽管有返回 Route 的指令示例。

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

【问题讨论】:

    标签: scala akka-http


    【解决方案1】:

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

    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)
      }
    }
    

    【讨论】:

    • 谢谢你,但是如何使用 forcomprehensive 来做同样的事情
    • 谢谢!有没有机会在最新版本的akka​​中获得一个工作示例或对其中一个场景的引用?由于 akka 和 akka-http 版本 2.5.19 和 10.1.8 的弃用错误,这将无法编译
    • 我已经将 akka-http 更新到 10.1.8 并且可以毫无问题地编译代码。确切的弃用错误是什么?
    猜你喜欢
    • 1970-01-01
    • 2018-03-16
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    相关资源
    最近更新 更多