Как получить доступ к полезной нагрузке запроса в Tapir/ZIOHttp DefaultServerLog?
Мы создаем микросервис REST с помощью Scala 3, ZIO 2, ведения журнала ZIO и Tapir.
Для ведения журнала в зависимости от контекста мы хотим использовать MDC и установить там атрибут, который берется из полезной нагрузки запроса.
Можно ли получить доступ к полезной нагрузке запроса в DefaultServerLog для извлечения атрибута MDC, а затем использовать его для ведения журнала MDC функции ведения журнала ZIO, т.е. создать LogAnnotation из извлеченного атрибута, чтобы он также регистрировался всеми методами DefaultServerLog (doLogWhenHandled и т. д.). .). В настоящее время он работает для наших собственных операторов журнала, но не для операторов Tapir/ZIO-HTTP.
1 ответ
Смотрите ответ здесь https://softwaremill.community/t/how-to-get-access-to-the-request-payload-in-tapir-ziohttp-defaultserverlog/84/3.
Адам Варски:
«Обычно это проблематично, так как тело запроса представляет собой поток байтов, который считывается из сокета по мере поступления. То есть запрос не загружается в память по умолчанию.
Вы можете обойти это, прочитав весь запрос в память, используя serverRequest.underlying.asInstanceOf[zio.http.Request].body.asArray, извлекая необходимую информацию и соответствующим образом обогащая локальные волокна. Вам также может понадобиться заменить Запрос копией, в которой тело предоставлено в виде массива байтов (в «строгой» форме), чтобы «правильный» анализатор тела не пытался повторно прочитать из сети ( где ничего не будет).
Однако у этого есть некоторые недостатки: тело будет проанализировано дважды (один раз вашим перехватчиком, один раз синтаксическим анализом, который будет определен позже); и он будет прочитан в память (что может быть проблематично, если у вас нет ограничения на размер тела)».