akka-http отвечает исходящим ответом, если не удалось

Я звоню по внешнему API и хочу вернуть пользователю результат "КАК ЕСТЬ", если код состояния отличается от " ОК":

val connectionFlow: Flow[HttpRequest, HttpResponse, Future[Http.OutgoingConnection]] =
  Http().outgoingConnection("akka.io")
def responseFuture: Future[HttpResponse] =
  Source.single(HttpRequest(uri = "/"))
    .via(connectionFlow)
    .runWith(Sink.head)

val fooRoutes = path("foo"){
get {
complete(
responseFuture.flatMap{ response =>
case OK => 
Unmarshal(response.entity.withContentType(ContentTypes.`application/json`)).to[Foo]
case _ => response //fails 
})}}

Как я могу вернуть ответ "КАК ЕСТЬ" в случае кода состояния, отличного от OK, не делая что-то вроде:

 Unmarshal(response.entity).to[String].flatMap { body =>
Future.failed(new IOException(s"The response status is ${response.status} response body is $body"))}

1 ответ

Решение

Я считаю, что могут быть разные допустимые способы решения этой проблемы, можно использовать onComplete директива:

  val fooRoutes = path("foo"){
    get {
      onComplete(responseFuture) {
        case Success(response) if response.status == OK =>
          complete(Unmarshal(response.entity.withContentType(ContentTypes.`application/json`)).to[Foo])

        case Success(response) => complete(response)
        case Failure(ex)    => complete((InternalServerError, s"An error occurred: ${ex.getMessage}"))
      }
    }
  } 
Другие вопросы по тегам