Descripción de un flujo de trabajo de Azure Logic Apps con el lenguaje de definición de flujo de trabajo

Completado

Puede definir la estructura y el flujo de trabajo de un flujo de trabajo de Azure Logic App mediante un documento JSON. Este documento contiene una descripción JSON de los elementos que componen el flujo de trabajo de la aplicación lógica y el esquema del lenguaje de definición de flujo de trabajo lo valida. La manera más fácil de explicar el esquema es examinar un flujo de trabajo existente creado mediante el diseñador de flujos de trabajo en Azure Portal y, a continuación, ver la descripción JSON de la aplicación lógica.

En el escenario de ejemplo, desea proporcionar flujos de trabajo comunes a sus consultores, que pueden adaptarlos a las necesidades específicas de las universidades con las que trabajan. Quiere que personalizar e implementar cada flujo de trabajo resulta tan fácil como sea posible, por lo que decide echar un vistazo al código detrás del flujo de trabajo, es decir, el JSON de definición de flujo de trabajo.

Diseñador de flujos de trabajo

El diseñador de flujos de trabajo le permite crear y depurar el flujo de trabajo para una aplicación lógica de manera gráfica. El diseñador también permite que los desarrolladores examinen el funcionamiento interno del flujo de trabajo para ver cómo se implementa. En la imagen siguiente se muestra un ejemplo de un flujo de trabajo simple, que se desencadena mediante el envío de una solicitud HTTP GET a una dirección URL especificada. El resultado se devuelve en la respuesta HTTP. En el ejemplo, el flujo de trabajo devuelve un simple mensaje Hello Logic Apps Template! (Hola plantilla de Logic Apps).

Diagrama en el que se muestra una introducción al diseñador de flujos de trabajo.

Ahora veamos el lenguaje de definición de flujo de trabajo tal como lo usa la plantilla JSON.

vista Código

En la ventana Vista de código se muestra el documento JSON que describe el flujo de trabajo. En la aplicación de ejemplo, el código JSON tiene este aspecto:

{
    "definition": {
        "$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#",
        "actions": {
            "Response": {
                "inputs": {
                    "body": "Hello Azure Logic Apps Template!",
                    "statusCode": 200
                },
                "kind": "Http",
                "runAfter": {},
                "type": "Response"
            }
        },
        "contentVersion": "1.0.0.0",
        "outputs": {},
        "parameters": {},
        "triggers": {
            "manual": {
                "inputs": {
                    "method": "GET",
                    "schema": {}
                },
                "kind": "Http",
                "type": "Request"
            }
        }
    }
}

Observe las secciones del ámbito definition que se relacionan con las acciones y los desencadenadores que se muestran en el diseñador. Puede editar el código JSON de este documento para reflejar cualquier cambio necesario en la funcionalidad del flujo de trabajo de aplicación lógica. También puede agregar más acciones y especificar cómo la lógica del flujo de trabajo se ejecuta de una acción a la otra.

Sección de desencadenadores

La sección triggers contiene la descripción del tipo de desencadenador y cómo se puede invocar. En este ejemplo, el desencadenador es un desencadenador HTTP sencillo que se ejecutan en respuesta a una solicitud HTTP GET.

"triggers": {
    "manual": {
        "inputs": {
            "method": "GET",
            "schema": {}
        },
        "kind": "Http",
        "type": "Request"
    }
}

Un desencadenador debe incluir los elementos siguientes:

  • Un nombre único dentro del flujo de trabajo. En el ejemplo anterior, el nombre predeterminado del desencadenador es manual, pero puede reemplazar el nombre predeterminado por un identificador más significativo.

  • El tipo de desencadenador. El tipo indica el evento que hace que el desencadenador se ejecute. Un desencadenador de Request se ejecuta en respuesta a una solicitud HTTP. Otros tipos de desencadenador disponibles incluyen:

    • Recurrence para crear un desencadenador que se ejecute según una programación periódica.

    • HttpWebhook para escuchar eventos en un punto de conexión.

    • ApiConnection para responder a eventos desencadenados por otros servicios de Azure, como un mensaje que llega a una cola de mensajes, un mensaje de correo electrónico, etc. El tipo de desencadenador ApiConnection se generaliza y se especifican detalles adicionales que indican el tipo del servicio y cualquier información de conexión necesaria.

  • La sección inputs. En esta sección se especifican los datos que definen el comportamiento del desencadenador. En el caso de un desencadenador Request, el method indica el tipo de solicitud HTTP que hace que se ejecute el desencadenador. Para un desencadenador de ApiConnection, la sección inputs contiene información sobre cómo conectarse al recurso que desencadena el evento (una cadena de conexión de cola de mensajes, por ejemplo). Si el desencadenador es un desencadenador de Request, la sección schema de la definición de entrada especifica el esquema al que debe ajustarse la carga del cuerpo de la solicitud. Las solicitudes HTTP GET no tienen un cuerpo de solicitud, por lo que el schema está vacío en el ejemplo anterior.

En el ejemplo siguiente se muestra la definición de otro desencadenador de Request que inicia un flujo de trabajo y recibe solicitudes HTTP POST. Normalmente, una solicitud POST proporciona un cuerpo de solicitud que contiene los datos que se van a publicar. En este ejemplo, el cuerpo de la solicitud contiene un nombre de cliente y su dirección, que consta de calle y ciudad.

"mypostrequest": {
   "type": "Request",
   "kind": "Http",
   "inputs": {
      "method": "POST",
      "schema": {
         "type": "object",
         "properties": {
            "customerName": {
               "type": "String"
            },
            "customerAddress": { 
               "type": "Object",
               "properties": {
                  "streetAddress": {
                     "type": "string"
                  },
                  "city": {
                     "type": "string"
                  }
               }
            }
         }
      }
   }
}

Un desencadenador también puede especificar condiciones. El desencadenador solo se activará si se cumplen estas condiciones. Puede definir condiciones en una sección de condiciones opcional. Por ejemplo, puede que desee ejecutar el desencadenador mypostrequest (que se muestra en el ejemplo anterior), solo si el cuerpo de la solicitud especifica una ciudad de New York:

"mypostrequest": {
   "type": "Request",
   "kind": "Http",
   "inputs": {
      ...
   }
   "conditions": [
      {
        "expression": "@equals(triggerOutputs()['body']['customerAddress']['city'], 'New York')"
      }
   ]
}

Sección de acciones

La sección actions de una aplicación lógica define la lógica y la estructura del flujo de trabajo. La sección contiene una serie de acciones. Una acción es un bloque de creación básico para construir flujos de trabajo. Las acciones realizan entradas y generan salidas, que se pasan a la siguiente acción del flujo de trabajo. En la tabla siguiente se enumeran los diferentes tipos de acciones disponibles:

Acción Descripción
ApiConnection Envía una solicitud HTTP a un servicio concreto. Este tipo de acción le permite integrar un flujo de trabajo de aplicación lógica con características de Azure como Azure Service Bus, Azure Event Grid y otras. La acción requiere entradas que incluyan una cadena de conexión para acceder al servicio y cualquier información y parámetros adicionales que se necesiten para invocar al servicio.
Compose Combina varias entradas y expresiones en una sola salida.
Function Permite llamar a una función de Azure.
HTTP Envía una solicitud HTTP a un punto de conexión HTTP en lugar de a un servicio de Azure.
Join Toma una matriz de elementos de datos como entrada y genera una cadena que contiene estos elementos separados por un delimitador especificado.
Parse Analiza un documento JSON en un conjunto de tokens mediante un esquema especificado.
Query Filtra los elementos de una matriz de entrada mediante una condición especificada.
Response Crea una respuesta para una solicitud HTTP.
Table Genera una tabla HTML a partir de una matriz de objetos JSON.
Terminate Cancela un flujo de trabajo de inmediato.
Wait Detiene el flujo de trabajo durante un intervalo especificado o hasta que se produzca un tiempo de espera.
Workflow Ejecuta otro flujo de trabajo de aplicación lógica.
Condition Conjunto de tipos de acción (Foreach, If, Switch, y Until) que permite implementar el flujo de control mediante programación en un flujo de trabajo. Puede iterar a través de los elementos de una colección, tomar decisiones basadas en los valores de los parámetros de entrada y entrar en un bucle hasta que se cumpla cierta condición.
InitializeVariable,
IncrementVariable,
DecrementVariable,
y SetVariable
Define, inicializa, asigna y modifica variables que puede transmitir entre los elementos de acción de un flujo de trabajo.

Al igual que lo que ocurre con un desencadenador, cada acción debe tener un nombre único en el flujo de trabajo. En el ejemplo siguiente, el nombre de acción predeterminado es Response, pero puede usar un identificador válido y más significativo. Una acción debe tener una sección inputs que especifique los datos en los que funciona la acción. En la acción Respuesta, puede especificar que los datos de una expresión se devuelvan en el mensaje de respuesta, junto con un código de estado HTTP.

En la definición del flujo de trabajo básico, la acción genera una respuesta HTTP en la que el cuerpo es un mensaje breve.

"actions": {
    "Response": {
        "inputs": {
            "body": "Hello Azure Logic Apps Template!",
            "statusCode": 200
        },
        "kind": "Http",
        "runAfter": {},
        "type": "Response"
    }
}

La sección runAfter indica dónde se ejecuta la acción en la secuencia de flujo de trabajo. En el ejemplo anterior, solo hay una acción única, por lo que siempre se ejecuta cuando se activa el desencadenador. Si el flujo de trabajo tuviera varias acciones, en esta sección podría especificar el nombre de una acción y un estado para esa acción. La acción se ejecuta si la acción runAfter se completa con el estado especificado. El código siguiente muestra un ejemplo. La acción mySecondAction se ejecuta después de myFirstAction, pero solo si myFirstAction finaliza con un estado de Succeeded:

"actions": {
    "mySecondAction": {
        "inputs": {
            ...
        },
        "runAfter": {
            "myFirstAction": [
                "Succeeded"
            ]
        },
        "type": ...
    },
    "myFirstAction": {
        "inputs": {
            ...
        },
        "runAfter": {},
        "type": ...
    }
}

Sección de salidas

Use la sección outputs para definir los datos que el flujo de trabajo puede devolver cuando haya terminado de ejecutarse. Puede hacer un seguimiento de un estado o de datos específicos para cada ejecución del flujo de trabajo. Puede examinar la salida de cada ejecución de un flujo de trabajo con el historial de ejecución de Azure Logic Apps, disponible en Azure Portal o la API REST del flujo de trabajo.

El formato de la sección outputs tiene este aspecto:

"outputs": {
  "<key-name>": {
    "type": "<key-type>",
    "value": "<key-value>"
  }
}

Expresiones de flujo de trabajo

Puede usar una expresión de flujo de trabajo en lugar de cualquier valor fijo, variable o constante. También puede colocar una expresión en cualquier lugar de un valor de cadena JSON mediante el prefijo de la expresión con el en el signo (@). Por ejemplo, puede usar la función @parameters en una expresión para recuperar el valor de un parámetro con nombre (los parámetros se describen en la sección siguiente).

"customerFullName": "Bill Frost",
"accountName": "@parameters('customerName')"

Azure Logic Apps proporciona funciones integradas que puede usar para crear expresiones complejas:

  • Funciones de cadena: Para concatenar o dividir cadenas, convertir caracteres entre mayúsculas y minúsculas y buscar subcadenas.
  • Funciones de colección: Para detectar si una colección contiene elementos que coincidan con un patrón específico, recuperar elementos de una colección y combinar colecciones.
  • Funciones de comparación lógicas: Para detectar si los operandos son iguales, distintos o mayores o menores en términos numéricos entre sí.
  • Funciones de conversión: Para cambiar el tipo o el formato de los datos.
  • Funciones matemáticas: Por ejemplo, add, sub, div, y mul, además de varios otros.
  • Funciones de fecha y hora: Para analizar y procesar fechas y horas.
  • Funciones de flujo de trabajo: Para recuperar información sobre los datos transmitidos a una acción de flujo de trabajo. Por ejemplo, la función parameter (mostrada anteriormente) captura el valor de un parámetro con nombre y la función body (mostrada anteriormente) devuelve los datos generados por una acción.
  • Funciones de manipulación JSON y XML: Para analizar y procesar documentos JSON y XML.

Puede definir variables en la sección inputs de una acción InitializeVariable y puede manipular estas variables mediante expresiones. Lea el valor de una variable mediante la función variables. En el ejemplo siguiente se usa una acción de InitializeVariable para crear una variable entera denominada myIntegerVariable e inicializarla en 99. En este ejemplo también se muestra una acción de Condition con el tipo If. La condición usa una expresión para probar el valor de la variable myIntegerVariable y si coincide con el valor 100, la condición usa una acción HTTP para realizar una solicitud GET.

"actions": {
    "Condition": {
        "actions": {
            "HTTP": {
                "inputs": {
                    "method": "GET",
                    "uri": "http://dummyurl.com"
                },
                "runAfter": {},
                "type": "Http"
            }
        },
        "expression": {
            "equals": [
                "@variables('myIntegerVariable')",
                100
            ]
        }        ,
        "runAfter": {
            "Initialize": [
                "Succeeded"
            ]
        },
        "type": "If"
    },
    "Initialize": {
        "inputs": {
            "variables": [
                {
                    "name": "myIntegerVariable",
                    "type": "Integer",
                    "value": 99
                }
            ]
        },
        "runAfter": {},
        "type": "InitializeVariable"
    }
}

Sección parameters

La sección parameters permite parametrizar un flujo de trabajo. En el runtime, puede proporcionar valores para cada uno de estos parámetros. Puede hacer referencia a los parámetros en cualquier lugar del flujo de trabajo donde puede usar una constante o una expresión.

Puede agregar una definición de parámetros con un valor predeterminado. El valor predeterminado se usa si no se proporciona un valor para el parámetro en el runtime. En el ejemplo siguiente se muestra cómo definir un parámetro denominado cityParam. El parámetro se usa dentro de la condición para la acción mypostrequest. Realiza la acción solo si el documento de la solicitud contiene una ciudad que coincide con el valor del parámetro. El valor del parámetro predeterminado es New York:


    "definition": {
        "$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#",
        "actions": {
            ...
        },
        "contentVersion": "1.0.0.0",
        "outputs": {},
        "parameters": {
            "cityParam": {
                "defaultValue": "New York",
                "type": "String"
            }
        },
        "triggers": {
            "mypostrequest": {
                "conditions": [
                    {
                        "expression": "@equals(triggerOutputs()['body']['customerAddress']['city'], parameters('cityParam'))"
                    }
                ],
                "inputs": {
                    ...
                },
                "kind": "Http",
                "type": "Request"
            }
        }
    }
}

Comprobación de conocimientos

1.

Quiere que el flujo de trabajo de Azure Logic Apps se ejecute cada tres minutos. ¿En cuál de las siguientes secciones de la definición de flujo de trabajo definiría este comportamiento recurrente?

2.

¿En qué sección de una definición de flujo de trabajo puede enviar una respuesta a una solicitud HTTP que devolverá un cuerpo de mensaje, un código de estado y encabezados de mensaje?

3.

¿En qué sección de la definición de flujo de trabajo se especifica un valor a devolver cuando se completa un flujo de trabajo?