Descrever um fluxo de trabalho dos Aplicativos Lógicos do Azure usando a linguagem de definição de fluxo de trabalho
Você define a estrutura e o fluxo de trabalho de um fluxo de trabalho do Aplicativo Lógico do Azure usando um documento JSON. Este documento contém uma descrição JSON dos elementos que compõem o fluxo de trabalho de aplicativo lógico e é validado pelo esquema da Linguagem de Definição de Fluxo de Trabalho. A maneira mais fácil de explicar o esquema é examinar um fluxo de trabalho existente criado usando o designer de fluxo de trabalho no portal do Azure e depois exibir a descrição JSON do aplicativo lógico.
No cenário de exemplo, é recomendável fornecer aos seus consultores fluxos de trabalho comuns, que eles podem adaptar às necessidades especificas das universidades com as quais eles trabalham. Convém facilitar o máximo possível a personalização e a implantação de cada fluxo de trabalho. Portanto, examine o código por trás do fluxo de trabalho, ou seja, o JSON da definição de fluxo de trabalho.
Designer de fluxo de trabalho
O designer de fluxo de trabalho permite criar e depurar o fluxo de trabalho de um aplicativo lógico graficamente. O designer também permite que os desenvolvedores examinem os bastidores de um fluxo de trabalho para ver como ele é implementado. A imagem a seguir mostra um exemplo de um fluxo de trabalho simples, que é disparado enviando uma solicitação HTTP GET a uma URL especificada. O resultado é retornado na resposta HTTP. Neste exemplo, o fluxo de trabalho está enviando de volta uma mensagem Olá, modelo de Aplicativos Lógicos!.
Agora vamos examinar a linguagem da definição de fluxo de trabalho conforme usada pelo modelo JSON.
Visualização do código
A janela Modo de exibição de código mostra o documento JSON que descreve o fluxo de trabalho. No aplicativo de exemplo, o JSON tem a seguinte aparência:
{
"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 as seções no escopo definition
que estão relacionadas às ações e aos gatilhos mostrados no designer. Você pode editar o código JSON neste documento para refletir as alterações necessárias na funcionalidade do fluxo de trabalho de aplicativo lógico. Também é possível adicionar mais ações e especificar como a lógica no fluxo de trabalho é executada de uma ação para a próxima.
Seção de gatilhos
A seção triggers
contém a descrição do tipo de gatilho e como ele pode ser invocado. Neste exemplo, ele é um gatilho HTTP simples executado em resposta a uma solicitação HTTP GET.
"triggers": {
"manual": {
"inputs": {
"method": "GET",
"schema": {}
},
"kind": "Http",
"type": "Request"
}
}
Um gatilho deve incluir os seguintes elementos:
um nome exclusivo dentro do fluxo de trabalho. No exemplo anterior, o nome padrão do gatilho é
manual
, mas você pode substituir o nome padrão por um identificador mais significativo.o tipo de gatilho. O tipo indica o evento que faz o gatilho ser executado. Um gatilho
Request
é executado em resposta a uma solicitação HTTP. Outros tipos de gatilho disponíveis incluem:Recurrence
para criar um gatilho executado de acordo com um agendamento recorrente.HttpWebhook
para escutar eventos em um ponto de extremidade.ApiConnection
para responder a eventos disparados por outros serviços do Azure, como uma mensagem que chega em uma fila de mensagens, um email e assim por diante. O tipo de gatilho ApiConnection é generalizado, e você especifica mais detalhes que indicam o tipo do serviço e quaisquer informações de conexão necessárias.
A seção
inputs
. Essa seção especifica os dados que definem o comportamento do gatilho. Para um gatilho Request, omethod
indica o tipo de solicitação HTTP que faz o gatilho ser executado. Para um gatilhoApiConnection
, a seçãoinputs
contém informações sobre como conectar-se ao recurso que dispara o evento (uma cadeia de conexão da fila de mensagens, por exemplo). Se ele for um gatilhoRequest
, a seçãoschema
da definição de entrada especificará o esquema com o qual o conteúdo do corpo da solicitação deve estar em conformidade. As solicitações HTTP GET não têm um corpo da solicitação; portanto, oschema
está vazio no exemplo anterior.
O exemplo a seguir mostra a definição de outro gatilho Request
que inicia um fluxo de trabalho e recebe solicitações HTTP POST. Normalmente, uma solicitação POST fornece um corpo da solicitação, que contém os dados a serem postados. O corpo da solicitação neste exemplo contém o nome e o endereço de um cliente, o que abrange a rua e a cidade.
"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"
}
}
}
}
}
}
}
Um gatilho também pode especificar condições. O gatilho só será disparado se essas condições forem atendidas. Você define condições em uma seção de condições opcional. Por exemplo, será conveniente executar o gatilho mypostrequest
(mostrado no exemplo anterior) apenas se o corpo da solicitação especificar uma cidade de New York
:
"mypostrequest": {
"type": "Request",
"kind": "Http",
"inputs": {
...
}
"conditions": [
{
"expression": "@equals(triggerOutputs()['body']['customerAddress']['city'], 'New York')"
}
]
}
Seção de ações
A seção actions
de um aplicativo lógico define a lógica e a estrutura do fluxo de trabalho. A seção contém uma série de ações. Uma ação é um bloco de construção básico para construir fluxos de trabalho. As ações aceitam entradas e produzem saídas, que são passadas para a próxima ação no fluxo de trabalho. A seguinte tabela lista diferentes tipos de ação disponíveis:
Ação | Descrição |
---|---|
ApiConnection |
Envia uma solicitação HTTP a um serviço específico. Esse tipo de ação permite integrar um fluxo de trabalho de aplicativo lógico a recursos do Azure, como o Barramento de Serviço do Azure e a Grade de Eventos do Azure, entre outras. A ação requer entradas que incluem uma cadeia de conexão para acessar o serviço e quaisquer informações e parâmetros adicionais necessários para invocá-lo. |
Compose |
Combina várias entradas e expressões em uma única saída. |
Function |
Permite que você chame uma Função do Azure. |
HTTP |
Envia uma solicitação HTTP a um ponto de extremidade HTTP, não a um serviço do Azure. |
Join |
Usa uma matriz de itens de dados como entrada e gera uma cadeia de caracteres que contém esses itens separados por um delimitador especificado. |
Parse |
Analisa um documento JSON em um conjunto de tokens, usando um esquema especificado. |
Query |
Filtra os itens em uma matriz de entrada usando uma condição especificada. |
Response |
Cria uma resposta para uma solicitação HTTP. |
Table |
Gera uma tabela HTML com base em uma matriz de objetos JSON. |
Terminate |
Cancela um fluxo de trabalho imediatamente. |
Wait |
Pausa o fluxo de trabalho durante um intervalo especificado ou até atingir o tempo limite. |
Workflow |
Executa outro fluxo de trabalho de aplicativo lógico. |
Condition |
Um conjunto de tipos de ação (Foreach , If , Switch e Until ) que permite implementar o fluxo de controle programático em um fluxo de trabalho. É possível iterar por meio dos itens em uma coleção, tomar decisões com base nos valores de parâmetros de entrada e fazer um loop até que algumas condições sejam atendidas. |
InitializeVariable ,IncrementVariable ,DecrementVariable ,SetVariable |
Define, inicializa, atribui e modifica variáveis que podem ser passadas entre itens de ação em um fluxo de trabalho. |
Como um gatilho, cada ação deve ter um nome exclusivo no fluxo de trabalho. No exemplo a seguir, o nome da ação padrão é Response
, mas você pode usar um identificador válido e mais significativo. Uma ação deve ter uma seção inputs
que especifica os dados nos quais a ação funciona. Na ação Response, você pode especificar os dados para que uma expressão seja retornada na mensagem de resposta, juntamente com um código de status HTTP.
Em nossa definição de fluxo de trabalho básico, a ação gera uma resposta HTTP em que o corpo é uma mensagem curta.
"actions": {
"Response": {
"inputs": {
"body": "Hello Azure Logic Apps Template!",
"statusCode": 200
},
"kind": "Http",
"runAfter": {},
"type": "Response"
}
}
A seção runAfter
indica o local em que a ação é executada na sequência de fluxo de trabalho. No exemplo anterior, há apenas uma ação individual; portanto, ela sempre é executada quando o gatilho é disparado. Se o fluxo de trabalho tivesse várias ações, você poderia especificar o nome de uma ação e um status para essa ação nesta seção. A ação será executada se a ação runAfter
for concluída com o status especificado. O código a seguir mostra um exemplo. A ação mySecondAction
é executada após myFirstAction
, mas somente se myFirstAction
terminar com um status de Succeeded
:
"actions": {
"mySecondAction": {
"inputs": {
...
},
"runAfter": {
"myFirstAction": [
"Succeeded"
]
},
"type": ...
},
"myFirstAction": {
"inputs": {
...
},
"runAfter": {},
"type": ...
}
}
Seção de saídas
Use a seção outputs
para definir os dados que seu fluxo de trabalho pode retornar quando ele concluir sua execução. Você pode acompanhar um status ou dados específicos para cada execução do fluxo de trabalho. É possível examinar a saída de cada execução de um fluxo de trabalho usando o histórico de execuções dos Aplicativos Lógicos do Azure, disponível no portal do Azure ou na API REST do fluxo de trabalho.
O formato da seção outputs
tem a seguinte aparência:
"outputs": {
"<key-name>": {
"type": "<key-type>",
"value": "<key-value>"
}
}
Expressões de fluxo de trabalho
É possível usar uma expressão de fluxo de trabalho em vez de um valor, uma variável ou uma constante fixa. Também é possível colocar uma expressão em qualquer lugar em um valor de cadeia de caracteres JSON, inserindo um prefixo na expressão com osinal de arroba (@). Por exemplo, é possível usar a função @parameters
em uma expressão para recuperar o valor de um parâmetro nomeado (os parâmetros são descritos na próxima seção).
"customerFullName": "Bill Frost",
"accountName": "@parameters('customerName')"
Os Aplicativos Lógicos do Azure fornecem um funções internas que podem ser usadas para criar expressões complexas:
- Funções da cadeia de caracteres: Para concatenar ou dividir cadeias de caracteres, converter caracteres entre minúsculas e maiúsculas e pesquisar subcadeias de caracteres.
- Funções de coleção: Para detectar se uma coleção contém itens que correspondem a um padrão específico, recuperar itens de uma coleção e combinar coleções.
- Funções de comparação lógica: Para detectar se os operandos são iguais, diferentes, numericamente maiores ou numericamente menores do que os outros.
- Funções de conversão: Para alterar o tipo ou o formato dos dados.
- Funções matemáticas: Como
add
,sub
,div
emul
, além de vários outros. - Funções de data e hora: Para analisar e processar datas e horas.
- Função do fluxo de trabalho: Para recuperar informações sobre os dados passados para uma ação de fluxo de trabalho. Por exemplo, a função de
parameter
(mostrada anteriormente) busca o valor de um parâmetro nomeado, e a função debody
(mostrada anteriormente) retorna os dados que estão sendo gerados por uma ação. - Funções de manipulação JSON e XML: Para analisar e processar documentos JSON e XML.
É possível definir variáveis na seção inputs
de uma ação InitializeVariable
e manipular essas variáveis usando expressões. Você lê o valor de uma variável usando a função de variables
. O exemplo a seguir usa uma ação InitializeVariable
para criar uma variável de inteiro chamada myIntegerVariable
e inicializá-la em 99
. Este exemplo também mostra uma ação Condition
com o tipo If
. A condição usa uma expressão para testar o valor da variável myIntegerVariable
e, se corresponder ao valor 100
, a condição usará uma ação HTTP para realizar uma solicitação 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"
}
}
Seção Parâmetros
A seção parameters
permite que você parametrize um fluxo de trabalho. Em runtime, é possível fornecer valores para cada um desses parâmetros. Você pode referenciar os parâmetros em qualquer lugar no fluxo de trabalho em que você possa usar uma constante ou uma expressão.
Adicione uma definição de parâmetros com um valor padrão. O valor padrão é usado se você não fornece um valor para o parâmetro em runtime. O exemplo a seguir mostra como definir um parâmetro chamado cityParam
. O parâmetro é usado dentro da condição para a ação mypostrequest
. Ele executará a ação somente se o documento de solicitação contiver uma cidade que corresponda ao valor do parâmetro. O valor de parâmetro padrão é 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"
}
}
}
}