es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Añadir interceptor a las rutas en Ktor no está funcionando.

Tengo una Ruta donde para cada ApplicationCall me gustaría agregar un encabezado a la respuesta.

por ejemplo:

rutas {
ruta(“/cdn-cached”) {
intercept(ApplicationCallPipeline.Features){
call.response.header(HttpHeaders.CacheControl, …)
}

    get(...) {...}
    post(...) {...}
    route(...) {...}

}
}

Este es un ejemplo simplificado de una configuración que tengo, pero lo que espero es que cada vez que llame a un punto final bajo la ruta /cdn-cached se adjunte el encabezado. Estoy seguro de que algo está mal, pero no sé qué.

¿Qué necesito arreglar en este código?

Nota: Tengo un marco de trabajo que hace muchas cosas dinámicas, hasta ahora ha podido hacer todo lo que quería, ahora me tropecé con esto. Solo menciono esto porque no es una buena opción para mí agregar el encabezado en cada ApplicationCall individualmente como get, post y route aquí. Podría hacerlo, pero preferiría no hacerlo si puedo hacerlo de manera similar a lo que describí en el ejemplo.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para agregar un encabezado a la respuesta para cada ApplicationCall bajo una ruta específica, puedes usar un interceptor de ApplicationCallPipeline.Features como se muestra en el código de ejemplo. Sin embargo, el encabezado debe agregarse a la respuesta después de que la solicitud haya sido manejada por los controladores correspondientes de los métodos HTTP como get, post y route, lo cual no ocurre en el código proporcionado.

    Para solucionarlo, debes crear una nueva ApplicationFeature que agregue el encabezado deseado a la respuesta y configurarla para que se utilice solo dentro de la ruta /cdn-cached. Aquí tienes un ejemplo de código:

    object CdnCachedHeaderFeature : ApplicationFeature<applicationcallpipeline, unit,="" unit=""> {
    
        override val key = AttributeKey<unit>("CdnCachedHeaderFeature")
    
        override fun install(pipeline: ApplicationCallPipeline, configure: Unit.() -> Unit) {
            pipeline.intercept(ApplicationCallPipeline.Features) {
                call.response.headers[HttpHeaders.CacheControl] = listOf("max-age=3600")
            }
        }
    }
    
    routes {
        route("/cdn-cached") {
            install(CdnCachedHeaderFeature)
    
            get(...) {...}
            post(...) {...}
            route(...) {...}
        }
    }
    

    Este código crea una nueva característica CdnCachedHeaderFeature que intercepta el ApplicationCallPipeline.Features y agrega el encabezado Cache-Control deseado a la respuesta. Luego, instala esta característica solo para la ruta /cdn-cached, utilizando la función install antes de definir los controladores de los métodos HTTP.

    Con este código, cada solicitud en la ruta /cdn-cached incluirá automáticamente el encabezado Cache-Control en la respuesta, sin necesidad de agregarlo explícitamente en cada ApplicationCall individual.</applicationcallpipeline,>

Comments are closed.