Estoy construyendo un microservicio en Ktor. Mientras estamos trabajando dentro del módulo de la aplicación, Ktor proporciona acceso al objeto de call que contiene datos de autorización.
Mi problema es que necesito acceder al objeto de call desde una clase de nivel de servicio. En Spring, haría esto accediendo a SecurityContext que está disponible globalmente a través de ThreadLocal . Ktor, al estar controlado por rutinas, no tiene esa opción.
¿Realmente necesito pasar el objeto de call a través de mis métodos de capa de servicio, o hay alguna forma en Ktor de tener algún tipo de objeto de "contexto de llamada" al que pueda acceder desde cualquier lugar?
Creo que no hay una oportunidad oficial incorporada en este momento.
He escrito una característica de Ktor que implementa ese comportamiento. La respuesta es demasiado complicada para describirla en pocas palabras.
Consulte el código + muestras, si está interesado. También se proporciona una guía de instalación.
=> https://github.com/MaaxGr/ktor-globalcalldata
Llame a la función de suspensión test() directa o indirectamente desde una ruta:
routing { get("/test") { test() call.respond("OK") } } Acceda al objeto de llamada a través callData().call
suspend fun test() { val url = callData().call.request.uri println(url) // prints "/test" }La biblioteca también permite agregar propiedades personalizadas que se pueden vincular a la rutina/llamada actual.