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

Я вызываю внешний API и хочу вернуть пользователю результат «КАК ЕСТЬ» в случае, если код состояния отличается от OK :

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

person igx    schedule 14.12.2016    source источник


Ответы (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}"))
      }
    }
  } 
person Stefano Bonetti    schedule 14.12.2016
comment
Спасибо, похоже на правильное решение. - person igx; 14.12.2016