【问题标题】:Custom Akka HTTP directive to async map response用于异步映射响应的自定义 Akka HTTP 指令
【发布时间】:2018-12-01 03:50:32
【问题描述】:

我正在尝试构建一个自定义的 Akka HTTP 指令,该指令将响应异步映射到另一个。给定以下定义:

trait ResponseFilter {
  def apply(request: HttpRequest, response: HttpResponse): Future[HttpResponse]
}

我想构建一个类似于此的指令(无法编译):

def filterResponse(responseFilter: ResponseFilter): Directive0 = {
  extractRequest { request =>
    mapResponse { response =>
      responseFilter(request, response)
    }
  }
}

编译错误是:

...type mismatch;
[error]  found   : scala.concurrent.Future[akka.http.scaladsl.model.HttpResponse]
[error]  required: akka.http.scaladsl.model.HttpResponse
[error]         responseFilter(request, response)
[error]               ^
[error] one error found

这是有道理的,因为mapResponse 是同步的。

我知道onSuccess,但它似乎无济于事。

【问题讨论】:

  • 编译器错误信息是什么?
  • 用编译器错误更新了问题。

标签: scala akka akka-http


【解决方案1】:

我在 Akka HTTP 源代码上花了一些时间,并提出了以下解决方案,它似乎可以按预期工作:

  def filterResponse(responseFilter: ResponseFilter): Directive0 = {
    Directive { inner => ctx =>
      implicit val ec = ctx.executionContext

      inner(())(ctx).flatMap {
        case result: Complete =>
          responseFilter(ctx.request, result.response).map { filteredResponse =>
            RouteResult.Complete(filteredResponse)
          }
        case incomplete => Future.successful(incomplete)
      }
    }
  }

如果有更好的方法,请告诉我!

【讨论】:

    猜你喜欢
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-24
    • 2017-08-12
    • 2016-03-28
    • 2020-02-05
    相关资源
    最近更新 更多