Нам нужно было тело ответа на неудачные запросы к API, поэтому мы придумали это решение:
Определите свой собственный класс ApiHttpError
с помощью code
и body
(для основного текста):
case class ApiHttpError(code: Int, body: String)
extends Exception("Unexpected response status: %d".format(code))
Определите OkWithBodyHandler
аналогично тому, что используется в источнике displatch
:
class OkWithBodyHandler[T](f: Response => T) extends AsyncCompletionHandler[T] {
def onCompleted(response: Response) = {
if (response.getStatusCode / 100 == 2) {
f(response)
} else {
throw ApiHttpError(response.getStatusCode, response.getResponseBody)
}
}
}
Теперь рядом с вашим вызовом кода, который может выдать исключение (вызов API
), добавьте переопределение implicit
к ToupleBuilder
(опять же аналогично исходному коду) и вызовите OkWithBody
для request
:
class MyApiService {
implicit class MyRequestHandlerTupleBuilder(req: Req) {
def OKWithBody[T](f: Response => T) =
(req.toRequest, new OkWithBodyHandler(f))
}
def callApi(request: Req) = {
Http(request OKWithBody as.String).either
}
}
С этого момента получение either
даст вам [Throwable, String]
(используя as.String)
, а Throwable
— это наши ApiHttpError
с code
и body
.
Надеюсь, это помогло.
person
Michael Vashchinsky
schedule
02.02.2015