return(GiS); return(GiS);

Mi sitio geek

  • Inicio
  • Cloud
    • Azure Active Directory
    • Azure Batch
    • Azure Key Vault
    • PaaS
    • Web Apps
    • serverless
      • Azure Functions
      • Logic Apps
    • Azure Maps
    • Application Insights
    • Azure Files
  • OAuth 2.0
  • Docker
  • K8S
  • AI
  • Blockchain
  • HTML 5
  • JS
  • .NET
  • Off-topic

Compatibilizar sistemas con los conectores de integración de Azure Logic Apps

in Azure Logic Apps on febrero 9, 2020 enero 22, 2021 by Gisela Torres

Últimamente parece que varios de mis clientes se han puesto de acuerdo en buscar soluciones a una de las tareas más tediosa y aburrida de todas : la integración de aplicaciones que hablan en formatos distintos y/o con mensajes con una composición diferente a la original. Quizás ya hayas oído hablar de Logic Apps, aunque muchas de las demostraciones en las que nos quedamos muchas veces es en la captura de un nuevo tweet, la lectura de una cuenta de correo, etcétera, cuando este servicio da mucho más de sí para escenarios muchos más complejos. Hoy te quiero hablar de cómo integrar diferentes sistemas gracias a Logic Apps.

¿Qué es Logic Apps?

Este servicio está pensado para generar flujos y procesos de una manera sencilla y gráfica. Para ello, el propio servicio pone a tu disposición diferentes tipos de conectores que nos facilita el trabajo de integración:

  • Conectores manejados: son aquellos listos para usar. La configuración es mínima y no requiere de ningún entendimiento por nuestra parte de cómo se comunica dicho conector con la fuente. Ejemplos de este tipo son la conexión con Twitter, SharePoint, Dropbox, Azure Storage, etcétera.
  • Conectores para conexión con recursos en local: Azure Logic Apps no solo se limita a la comunicación entre servicios que están públicamente expuestos, sino que también es posible conectarse con aquellos que están on-premises, como puede ser una base de datos Oracle, un SQL Server, Biztalk Server, Teradata, etcétera. Para poder utilizar este tipo de conectores es necesario instalar un componente llamado data gateway.
  • Conectores de integración: Estos son de los que quiero hablar en este artículo y son aquellos que nos van a permitir crear soluciones B2B (Business to Business). Para poder hacer uso de los mismos es necesario el uso de un recurso llamado Integration Account que te explicaré a continuación.

Conectores de Integración

Como comentaba al inicio de este artículo, este es un escenario que me están pidiendo cada vez más debido a lo sencillo que resulta con Azure Logic Apps. Para verlo con un ejemplo, voy a utilizar un escenario común que me han preguntado más de una vez: cómo podemos devolver de un entorno legacy que devuelve una respuesta en XML, con un formato arcaico, una respuesta JSON con una composición mucho más acorde al 2020 😀 Para este tipo de escenarios los conectores de integración son perfectos, ya que nos permiten no solo devolver la respuesta en un formato diferente sino que podemos alterar el contenido para ajustarlo a las nuevas necesidades. Te muestro paso a paso cómo conseguirlo.

XML del que partimos

Si me conoces un poco, sabes que lo mío son los ejemplos 🙂 Suponte que el XML que recibimos de un sistema legacy es el siguiente:

<?xml version="1.0"?>
<catalog>
    <book id="bk101">
        <author>Gambardella, Matthew</author>
        <title>XML Developer's Guide</title>
        <genre>Computer</genre>
        <price>44.95</price>
        <publish_date>2000-10-01</publish_date>
        <description>An in-depth look at creating applications 
      with XML.</description>
        <codes>
            <ISBN>0072224576</ISBN>
            <ISBN13>9780072224573</ISBN13>
        </codes>
    </book>
    <book id="bk102">
        <author>Ralls, Kim</author>
        <title>Midnight Rain</title>
        <genre>Fantasy</genre>
        <price>5.95</price>
        <publish_date>2000-12-16</publish_date>
        <description>A former architect battles corporate zombies, 
      an evil sorceress, and her own childhood to become queen 
      of the world.</description>
        <codes>
            <ISBN>1410742431</ISBN>
            <ISBN13>9781410742438</ISBN13>
        </codes>
    </book>
</catalog>

Como ves, este se trata de un catalogo de libros, el cual tiene atributos y luego diferentes hijos con diferentes niveles, para ver una casuística más o menos real.

El JSON que esperamos

El objetivo de esta integración, como te decía, no es solo pasar lo mismo que tenemos en ese XML a JSON sino que además queremos alterar el contenido que viene en el mismo, obteniendo un resultado similar al siguiente:

[
    {
        "id": "bk101",
        "title": "XML Developer's Guide",
        "description": "An in-depth look at creating applications with XML.",
        "publishedDate": "2000-10-01",
        "authors": [
            "Gambardella, Matthew"
        ],
        "genre": "Computer",
        "price": "44.95",
        "codes": [
            {
                "type": "ISBN",
                "code": "0072224576"
            },
            {
                "type": "ISBN13",
                "code": "9780072224573"
            }
        ]
    },
    {
        "id": "bk102",
        "title": "Midnight Rain",
        "description": "A former architect battles corporate zombies, an evil sorceress, and her own childhood to become queen of the world.",
        "publishedDate": "2000-12-16",
        "authors": [
            "Ralls, Kim"
        ],
        "genre": "Fantasy",
        "price": "5.95",
        "codes": [
            {
                "type": "ISBN",
                "code": "1410742431"
            },
            {
                "type": "ISBN13",
                "code": "9781410742438"
            }
        ]
    }
]

Vamos a ver paso a paso cómo llegar a este resultado.

Crear una Integration Account

Para poder utilizar este tipo de conectores lo primero que necesitas es un servicio de Microsoft Azure llamado Integration Account. Puedes crearlo de la misma forma que el resto, a través del portal utilizando el botón Create a resource.

Microsoft Azure - Create a resource - Integration Account
Microsoft Azure – Create a resource – Integration Account

Haz clic en el botón Create y elige una suscripción, un grupo de recursos (en mi caso he creado uno nuevo llamado Books-Integration-With-Logic-Apps), una región y un pricing tier (en mi caso he elegido el Basic porque ya he agotado los Free :)). Si todo está correcto tan solo tendrás que esperar unos segundos para tener listo el nuevo recurso.

Microsoft Azure – Creación de una Integration Account

Este tipo de recursos está compuesto de diferentes componentes:

Para este artículo solo vamos a utilizar el segundo de todos ellos, Maps, pero, como ves, existen otros tipos para otros escenarios de integración. Tienes más información aquí.

Maps

Para las transformaciones de XML a JSON este servicio te permite el uso de plantillas Liquid, creadas por Shopify, que te ayudan a definir cómo será el JSON de salida en base al contenido que recibimos. En nuestro ejemplo he creado una plantilla llamada XmlToJsonTemplate.liquid con este contenido:

[
{% JSONArrayFor item in content -%}
{
      "id": "{{item.id}}",
      "title": "{{item.title}}",
      "description": "{{item.description}}",
      "publishedDate": "{{item.publish_date}}",
      "authors": [
            "{{item.author}}"
      ],
      "genre": "{{item.genre}}",
      "price": "{{item.price}}",
      "codes": [
            {
                  "type" : "ISBN",
                  "code": "{{item.codes.ISBN}}"
            },
            {
                  "type" : "ISBN13",
                  "code": "{{item.codes.ISBN13}}"
            }
      ]
}
{% endJSONArrayFor -%}
]

Estas se suben en el apartado Maps de tu cuenta de integración, especificando el tipo Liquid y añadiéndole un nombre que no tiene por qué coincidir con el del archivo:

Crear una Logic App y asociarla a tu Integration Account

Ahora que ya tienes al menos una plantilla, el siguiente paso es crear una Logic App que la utilice. Crea una Logic App en el mismo grupo de recursos donde creaste la Integration Account.

Cuando finalice el proceso, en el apartado Workflow Settings asocia ambos recursos:

Ahora, en el diseñador de la Logic App el flujo que utilizo inicialmente para probar la transformación es el siguiente:

Como ves, tiene únicamente tres conectores:

  1. When a HTTP request is received me permite llamar a una URL con el XML que quiero transformar a JSON.
  2. Liquid – Transform XML to JSON es el conector que necesita tener configurado, a nivel de Logic App, la Integration Account. Aquí es donde tienes que elegir que Map se va a utilizar (en este caso el subido anteriormente con el nombre XMLToJSON) y cuál es el contenido a procesar, que en este caso viene del conector anterior (Body).
  3. Response lo utilizo para que nos devuelva el resultado en la herramienta que utilicemos para hacer la llamada.

Probando la transfomación con Postman

Para comprobar el resultado de la transformación voy a utilizar Postman, donde voy a usar la URL proporcionada por el primer conector, el método POST y como cuerpo el XML origen que te mostré al inicio del artículo. El resultado será como el que sigue:

Parece que todo ha salido correctamente, excepto el id que aparece en blanco en ambos libros. Si revisas el XML de ejemplo este valor no viene como un hijo del elemento book sino como un atributo del mismo. Como es un caso habitual, quería que lo vieras ya que ante esta situación necesitaríamos un paso adicional antes de que Liquid convierta nuestro XML a JSON de manera correcta (este no soporta atributos). Para arreglarlo, vamos a crear un archivo llamado XMLNormalizeBook.xslt con esta transformación:

<xsl:stylesheet
    version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" method="xml" version="1.0" />
	<xsl:template match="/">
        <catalog>
            <xsl:for-each select="catalog/book">
                <book>
                    <id>
                        <xsl:value-of select="@id" />
                    </id>
                    <author>
                        <xsl:value-of select="author/text()" />
                    </author>
                    <title>
                        <xsl:value-of select="title/text()" />
                    </title>
                    <genre>
                        <xsl:value-of select="genre/text()" />
                    </genre>
                    <price>
                        <xsl:value-of select="price/text()" />
                    </price>
                    <publish_date>
                        <xsl:value-of select="publish_date/text()" />
                    </publish_date>
                    <description>
                        <xsl:value-of select="description/text()" />
                    </description>
                    <codes>
                        <ISBN>
                            <xsl:value-of select="codes/ISBN/text()" />
                        </ISBN>
                        <ISBN13>
                            <xsl:value-of select="codes/ISBN/text()" />
                        </ISBN13>
                    </codes>
                </book>
            </xsl:for-each>
        </catalog>
    </xsl:template>
</xsl:stylesheet>

En tu cuenta de integración sube el archivo en el apartado Maps, indicando esta vez que el formato es XSLT:

Ahora en la Logic App añade un paso previo donde debes elegir como conector Transform XML, contenido el Body del conector anterior y como Map el que acabas de crear:

Normaliza el XML antes de transformarlo a JSON con Liquid

Si vuelves a ejecutar la llamada comprobarás que ahora el resultado contiene todos los valores ¡y sin cambiar la llamada!

Resultado esperado con la normalización y transformación con Liquid

¡Saludos!

Azure Logic Apps Integration Account Microsoft Azure

Artículo anterior

← Jobs en Kubernetes
Jobs en Kubernetes

Siguiente artículo

Cómo funcionan las etiquetas en Kubernetes →
Cómo funcionan las etiquetas en Kubernetes

Sígueme

  • LinkedIn
  • Twitter
  • Facebook
  • Instagram
  • GitHub
  • YouTube
  • Mastodon

Sobre mí

return(GiS); Me llamo Gisela Torres y trabajo en Microsoft como Cloud Solution Architect enfocada en el desarrollo de aplicaciones en la nube. Se trata de un puesto técnico cuya misión es apoyar y asesorar sobre soluciones y arquitecturas cloud, utilizando Microsoft Azure como plataforma. También soy profesora en Lemoncode {🍋}. Pero antes de todo esto, trabajé como arquitecta de software y desarrolladora de aplicaciones en varias empresas. Durante esos años tuve la suerte de ser premiada como Most Valuable Professional en Microsoft Azure y fue poco antes cuando comencé a escribir este blog. Me encanta programar y la tecnología en general, por eso este blog habla de todo esto. De lo que vivo, de lo que aprendo y de lo que hago con la tecnología en mi día a día.
Juegaterapia
Buy me a coffeeBuy me a coffee

Populares

  • Publicar tu imagen en Docker Hub
    Publicar tu imagen en Docker Hub
  • Llamar a un servicio SOAP con WCF desde Postman o Fiddler
    Llamar a un servicio SOAP con WCF desde Postman o Fiddler
  • OAuth 2.0, OpenID Connect y JSON Web Tokens (JWT) ¿Qué es qué?
    OAuth 2.0, OpenID Connect y JSON Web Tokens (JWT) ¿Qué es qué?
  • Ejecutar aplicaciones multi-contenedor con docker-compose
    Ejecutar aplicaciones multi-contenedor con docker-compose
  • Cómo ver caracteres especiales con el editor de Visual Studio
    Cómo ver caracteres especiales con el editor de Visual Studio
  • Cómo saber la fecha y hora exacta de una publicación en Instagram
    Cómo saber la fecha y hora exacta de una publicación en Instagram

Etiquetas

.NET .NET AKS App Service ASP.NET MVC Azure Active Directory Azure App Service Azure Automation Azure DevOps Azure Functions Azure Kubernetes Service Azure Media Services Azure Media Services Azure Storage Azure Websites C# Cloud Services Dapr Docker ECMAScript 6 ES6 Eventos GitHub GitOps HTML 5 IaaS IIS Java JavaScript JQuery Kubernetes Microsoft Azure Microsoft Azure Microsoft Azure Microsoft Bot Framework Node.js OAuth 2.0 PHP PowerShell Privacidad Seguridad Visual Studio Visual Studio Code Windows Azure Windows Azure Storage

Archivo

Privacidad y cookies: este sitio utiliza cookies. Al continuar utilizando esta web, aceptas su uso.
Para obtener más información, incluido cómo controlar las cookies, consulta aquí: Política de cookies

Suscríbete al blog por correo electrónico

Introduce tu correo electrónico para suscribirte a este blog y recibir notificaciones de nuevas entradas.

return(GiS); 2009 – 2023

Contenidos bajo licencia  CC BY-SA 4.0 | También estoy en Mastodon