【问题标题】:Akka http route with scala future具有 scala 未来的 Akka http 路由
【发布时间】:2020-06-05 11:59:58
【问题描述】:

情况是这样的

// validateRoute act like a directive which validate a route before proceeding further
override def validateRoute(route: Route)(implicit ec: ExecutionContext): Route = {
  extractRequest { request =>
    decodeRequest {
      entity(as[String]) { content =>
        (headerValueByName("header1") & headerValueByName("header2")) {
          case (header1, header2) => {
            // dom some
            // validate() returns a Future[Either[Error, Boolean]]
            validate().map {
              result => {
                result match {
                  case Right(_) => route
                  case Left(ex) => complete(StatusCodes.Unauthorized -> ex.getMessage)
                }
              }
            }
          } // I get a error here saying It expect route whereas it is Future[Route]
        }
      }
    }
  }
}

我收到上述错误,也无法更改 validate () 的返回类型,有没有办法解决这个问题。我需要一种方法来返回路由而不是 Future[Route]

【问题讨论】:

    标签: scala future akka-http


    【解决方案1】:

    如果您注册了handleRejections 指令,则可以在Future 上使用onSuccess 指令:

    onSuccess(validate()) {
      case Right(_) => route
      case Left(ex) => complete(StatusCodes.Unauthorized -> ex.getMessage)
    }
    

    否则,您可以使用 onComplete 指令,并且您必须匹配 SuccessFailure

    【讨论】:

      【解决方案2】:

      如果您必须返回路线而不是 Future[Route],您可以尝试使用

      Await.result(validate(), Duration(2, TimeUnit.SECONDS)) //substitute your choice of duration
      

      这将阻塞直到验证返回。

      所以完整的解决方案看起来像,

      // validateRoute act like a directive which validate a route before proceeding further
      override def validateRoute(route: Route)(implicit ec: ExecutionContext): Route = {
        extractRequest { request =>
          decodeRequest {
            entity(as[String]) { content =>
              (headerValueByName("header1") & headerValueByName("header2")) {
                case (header1, header2) => {
                  // dom some
                  // validate() returns a Future[Either[Error, Boolean]]
                  Await.result(validate(),Duration(2, TimeUnit.SECONDS) ) match 
                      {
                        case Right(_) => route
                        case Left(ex) => complete(StatusCodes.Unauthorized -> ex.getMessage)
                      }
                }  
              }
            }
          }
        }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-25
        • 1970-01-01
        • 2021-05-07
        • 1970-01-01
        相关资源
        最近更新 更多