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

Мои вопросы:

  1. Как я могу вернуть свой пользовательский ответ вместо одного изzhttp.http?
  2. Как я мог поймать все ошибки из маршрутов - это выглядит такtapirпоймать все ошибки вzServerLogicи поймать все исключения там и вернуть толькоEither, поэтому мое промежуточное ПО ошибки всегда возвращает правильную сторону. Как я могу исправить это, чтобы отловить все ошибки приложения? Например, когда я указал неправильный URL-адрес конечной точки или что-то плохое произошло во время логики обработки?

Можно ли создать что-то похожее на обработчик отклонения Akka для обработки всех ошибок на стороне API? Или может есть другое решение?

0 ответов

Другие вопросы по тегам