Scala, ZIO, Tapir - zio-http и tapir, как создать обработчик отказа/ошибки на стороне API?
У меня странная проблема с ошибкой промежуточного слоя или я использую его неправильно. Я хотел бы добавить промежуточное программное обеспечение ошибок к своим маршрутам тапира и перехватывать все ошибки «изнутри» приложения. У меня есть простой маршрут тапира:
object SomeApi{
val zServerLogic = SomeTapirEndpoint.someRoute.zServerLogic(_ => ZIO.succeed(MyEmptyResponse))
def myApiRoutes: HttpApp[Any, Throwable] =
ZioHttpInterpreter().toHttp(
zServerLogic
)
}
Я также добавил его на сервер при его запуске:
_ <- Server
.start(
port = config.port,
http = myapis @@ ErrorMiddleware.errorMiddleware
)
.exitCode
Промежуточное ПО ошибок выглядит следующим образом:
object ErrorMiddleware {
val errorMiddleware = new HttpMiddleware[Any, Throwable] {
override def apply[R1 <: Any, E1 >: Throwable](
http: HttpApp[R1, E1]
) =
http.catchAll { ex =>
val errorResponse: ZIO[Any, IOException, MyResponse] = for {
_ <- ZIO.logError(s"Logic failed: ${ex.toString}")
} yield MyResponse("FAIL")
ZIO.succeed(errorResponse)
}
}
}
Мои вопросы:
- Как я могу вернуть свой пользовательский ответ вместо одного из
zhttp.http
? - Как я мог поймать все ошибки из маршрутов - это выглядит так
tapir
поймать все ошибки вzServerLogic
и поймать все исключения там и вернуть толькоEither
, поэтому мое промежуточное ПО ошибки всегда возвращает правильную сторону. Как я могу исправить это, чтобы отловить все ошибки приложения? Например, когда я указал неправильный URL-адрес конечной точки или что-то плохое произошло во время логики обработки?
Можно ли создать что-то похожее на обработчик отклонения Akka для обработки всех ошибок на стороне API? Или может есть другое решение?