Transformaciones de Peticiones y Respuestas HTTP con Kong

Una necesidad habitual en un API Manager es poder modificar las peticiones HTTP entrantes así como las respuestas HTTP que se envían a los consumidores, añadiendo/modificando/eliminando encabezados y Query Strings, incluso el cuerto (body) o cambiando el método/verbo HTTP. Kong proporciona varios Plugins para este comentido (Request Transformer, Response Transformer, y Correlation Id) que podemos configurar fácilmente, ya sea con la API de Kong o través de Konga

Continuando con la serie de Posts acerca de Kong, en esta ocasión vamos a ver cómo podemos realizar transformaciones sobre las peticiones HTTP entrantes (para que lleguen modificadas conforme a nuestras necesidades, a las APIs destino), así como realizar también transformaciones sobre las respuestas HTTP antes de que llegen al consumidor. Veremos cómo configurar con Konga los Plugins encargados de estas tareas (Request Transformer, Response Transformer, y Correlation Id), y cómo probarlo con un curl. Estas transformaciones son una necesidad muy habitual, y aunque las podemos realizar de forma sencilla utilizando sólo NGINX, con Kong y Konga es aún más sencillo.

Si quieres seguir este Post paso a paso, te recomiendo que te apoyes en el Docker Compose que compartí en GitHub (GitHub – ElWillieES – kong-docker-lab) y que revises los anteriores Post, al menos el primero (Introducción a Kong Gateway y Kong Dashboard) que además de hacer una introducción a Kong, también explica el Docker Compose compartido en GitHub.

Si has seguido los anteriores Posts haciendo los diferentes laboratorios, para hacer los ejercicios de este Post, deberías deshabilitar todos los Plugins de los laboratorios anteriores.

Dicho esto, comenzamos.

Plugin Request Transformer

Permite realizar transformaciones simples en las peticiones HTTP entrantes (sustituciones simples o más complejas utilizando RegExp), de tal modo que la petición que llegue finalmente a nuestra API pueda ser diferente a la original en base a nuestras necesidades, pudiendo cambiar el método HTTP, añadir/modificar/eleminar tanto encabezados, como QueryStrings, e incluso el propio Body. Para más información acerca del Plugin de Request Transformer: Kong – Plugin – Request Transformer

Para probarlo, vamos a añadir el Plugin de Request Transformer a un servicio (Servicio A de nuestro Docker Compose), utilizando Konga.

En la siguiente pantalla podemos configurar las transformaciones que deseamos realizar. En nuestro caso, vamos a realizar un ejemplo sencillo, que consiste en:

  • Renombrar el encabezado header1 como headerN
  • Renombrar la Query String qp1 como qpN
  • Añadir al cuerpo del mensaje (body) una clave name con valor test-name
  • Añadir un encabezado api-key con un valor

Podemos probarlo con un simple comando curl como el siguiente:

curl -i --location 'http://localhost:8000/service-a?qp1=pruebaqp1' -H 'header1:value1'

A continuación podemos ver cómo en el resultado de ejecución del comando curl, se ha añadido el encabezado api-key, y se han renombrado el encabezado header1 y la Query String qp1, aunque no podemos ver cómo se ha añadido al body la clave name, ya que el endpoint que estamos utilizando en esta prueba, no hace echo del body, por lo que no podemos verlo gráficamente.

Plugin Response Transformer

Permite realizar transformaciones simples en las respuestas HTTP, de tal modo que la respuesta que llegue finalmente a nuestros consumidores pueda ser diferente a la original en base a nuestras necesidades, pudiendo añadir/modificar/eleminar tanto encabezados, como el propio cuerpo (body) de la respuesta. Para más información acerca del Plugin de Response Transformer: Kong – Plugin – Response Transformer

Para probarlo, vamos a añadir el Plugin de Response Transformer a un servicio (Servicio C de nuestro Docker Compose), utilizando Konga.

En la siguiente pantalla podemos configurar las transformaciones que deseamos realizar. En nuestro, vamos a realizar un ejemplo muy sencillo, que consiste simplemente en añadir un encabezado a la respuesta con un valor determinado.

Podemos probarlo con un simple comando curl como el siguiente:

curl -i --location 'http://localhost:8000/service-c'

A continuación podemos ver cómo en el resultado de ejecución del comando curl, se ha añadido a la respuesta el encabezado que hemos configurado.

Plugin Correlation Id

Permite transformar la petición HTTP entrante que se enviará a nuestra API, así como la respuesta que se enviará al Consumidor, añadiendo un encabezado con un ID para mejorar la trazabilidad, de tal modo que se puedan comprobar los Logs de nuestra API y de nuestros Consumidores, para relacionarlos (la misma petición enviará el mismo ID que luego incluirá en la respuesta al consumidor) y poder depurar incidencias que puedan ocurrir. Para más información acerca del Plugin de Correlation Id: Kong – Plugin – Correlation Id

Para probarlo, vamos a añadir el Plugin de Correlation Id a un servicio (Servicio C de nuestro Docker Compose), utilizando Konga.

En la siguiente pantalla podemos especificar el encabezado que deseamos utilizar para añadir el Correlation Id, el formato para la generación del Correlation Id, y si deseamos que también se devuelva en la respuesta HTTP al consumidor o cliente. Click Add Plugin para continuar.

Podemos probarlo con un simple comando curl como el siguiente:

curl -i --location 'http://localhost:8000/service-c'

A continuación podemos ver cómo en el resultado de ejecución del comando curl, se ha añadido a la respuesta el encabezado con el Correlation Id que hemos configurado.

Despedida y Cierre

Hasta aquí llega este Post sobre Kong, donde hemos podido ver cómo utilizar Kong para modificar las peticiones y respuestas HTTP conforme a nuestras necesidades mediante el uso de Plugins (Request Transformer, Response Transformer, y Correlation Id), su configuración mediante Konga, y probándolos mediante comandos curl, utilizando el Docker Compose compartido en GitHub para quienes deseen seguir este laboratorio paso a paso: GitHub – ElWillieES – kong-docker-lab

Poco más por hoy, como siempre confío que la lectura resulte de interés.