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