Пользовательская директива HTTP Akka для асинхронного ответа карты - PullRequest
0 голосов
/ 01 декабря 2018

Я пытаюсь создать собственную HTTP-директиву Akka, которая асинхронно отображает ответ другому.Учитывая следующее определение:

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, но, похоже, это не помогает.

1 Ответ

0 голосов
/ 01 декабря 2018

Я провел немного времени с источником HTTP Akka и нашел следующее решение, которое, кажется, работает должным образом:

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

Если есть лучший способ сделать это, пожалуйста,я знаю!

...