Azure 逻辑应用中工作流定义语言的架构参考指南

Azure 逻辑应用中创建逻辑应用时,逻辑应用具有一个基础工作流定义,用于描述逻辑应用中运行的实际逻辑。 该工作流定义使用 JSON ,并遵循工作流定义语言架构验证的结构。 此参考概述了此结构,以及架构如何在工作流定义中定义属性。

工作流定义结构

工作流定义始终包括用于实例化逻辑应用的触发器,以及触发触发器后运行的一个或多个作。

下面是工作流定义的高级结构:

"definition": {
  "$schema": "<workflow-definition-language-schema-version>",
  "actions": { "<workflow-action-definitions>" },
  "contentVersion": "<workflow-definition-version-number>",
  "outputs": { "<workflow-output-definitions>" },
  "parameters": { "<workflow-parameter-definitions>" },
  "staticResults": { "<static-results-definitions>" },
  "triggers": { "<workflow-trigger-definitions>" }
}
Attribute 必选 Description
definition 是的 工作流定义的起始元素
$schema 仅当外部引用工作流定义时 描述工作流定义语言版本的 JSON 架构文件的位置,可在此处找到:

https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json
actions 在工作流运行时执行的一个或多个作的定义。 有关详细信息,请参阅 触发器和作



最大作数:250
contentVersion 工作流定义的版本号,默认为“1.0.0.0”。 若要帮助确定和确认部署工作流时的正确定义,请指定要使用的值。
outputs 要从工作流运行返回的输出的定义。 有关详细信息,请参阅 输出



最大输出数:10
parameters 传递逻辑应用运行时要使用的值的一个或多个参数的定义。 有关详细信息,请参阅 “参数”。



最大参数数:50
staticResults 当在这些作上启用静态结果时,作返回为模拟输出的一个或多个静态结果的定义。 在每个作定义中,属性 runtimeConfiguration.staticResult.name 引用内部 staticResults的相应定义。 有关详细信息,请参阅 静态结果
triggers 实例化工作流的一个或多个触发器的定义。 可以定义多个触发器,但只能使用工作流定义语言,而不是通过工作流设计器直观地定义。 有关详细信息,请参阅 触发器和作



最大触发器数:10

触发器和作

在工作流定义中, triggersactions 部分定义工作流执行期间发生的调用。 有关这些部分的语法和详细信息,请参阅 工作流触发器和作

参数

部署生命周期通常具有不同的开发、测试、过渡和生产环境。 将逻辑应用部署到各种环境时,可能需要根据部署需求使用不同的值,例如连接字符串。 或者,你可能希望在整个逻辑应用中重复使用的值,而无需进行硬编码或经常更改。 在工作流定义的 parameters 部分中,可以为逻辑应用在运行时使用的值定义或编辑参数。 必须先定义这些参数,然后才能在工作流定义中的其他位置引用这些参数。

下面是参数定义的常规结构:

"parameters": {
   "<parameter-name>": {
      "type": "<parameter-type>",
      "defaultValue": <default-parameter-value>,
      "allowedValues": [ <array-with-permitted-parameter-values> ],
      "metadata": {
         "description": "<parameter-description>"
      }
   }
},
Attribute 必选 类型 Description
< parameter-name> 是的 String 要定义的参数的名称
< parameter-type> 是的 int, float, string, bool, array, object, securestring, secureobject



注意:对于所有密码、密钥和机密,请使用 securestringsecureobject 类型,因为 GET 作不返回这些类型。 有关保护参数的详细信息,请参阅 作和输入参数的安全建议
参数的类型
< default-parameter-value> 是的 type 如果未在工作流实例化时指定任何值,则使用的默认参数值。 属性 defaultValue 是必需的,以便逻辑应用设计器可以正确显示参数,但可以指定空值。
< array-with-allowed-parameter-values> Array 一个数组,其中包含参数可以接受的值
< parameter-description> JSON 对象 任何其他参数详细信息,例如参数的说明

接下来,为工作流定义创建 Azure 资源管理器模板 ,定义接受部署时所需的值的模板参数,根据需要将硬编码的值替换为对模板或工作流定义参数的引用,并将要在部署时使用的值存储在单独的 参数文件中。 这样,便可以更轻松地通过参数文件更改这些值,而无需更新和重新部署逻辑应用。 对于敏感或必须保护的信息(例如用户名、密码和机密),可以将这些值存储在 Azure Key Vault 中,并让参数文件从密钥保管库中检索这些值。 有关在模板和工作流定义级别定义参数的详细信息和示例,请参阅 概述:使用 Azure 资源管理器模板自动部署逻辑应用

静态结果

staticResults 属性中,定义作的模拟 outputs ,并在 status 打开作的静态结果设置时返回该作。 在作的定义中,属性 runtimeConfiguration.staticResult.name 引用内部 staticResults静态结果定义的名称。 了解如何 通过设置静态结果通过模拟数据测试逻辑应用工作流

"definition": {
   "$schema": "<...>",
   "actions": { "<...>" },
   "contentVersion": "<...>",
   "outputs": { "<...>" },
   "parameters": { "<...>" },
   "staticResults": {
      "<static-result-definition-name>": {
         "outputs": {
            <output-attributes-and-values-returned>,
            "headers": { <header-values> },
            "statusCode": "<status-code-returned>"
         },
         "status": "<action-status>"
      }
   },
   "triggers": { "<...>" }
}
Attribute 必选 类型 Description
< static-result-definition-name> 是的 String 作定义可以通过对象引用 runtimeConfiguration.staticResult 的静态结果定义的名称。 有关详细信息,请参阅 运行时配置设置

可以使用所需的任何唯一名称。 默认情况下,此唯一名称将追加一个数字,并根据需要递增。
< output-attributes-and-values-returned> 是的 不同 这些属性的要求因不同的条件而异。 例如,当为 statusSucceeded属性时,该 outputs 属性包括作返回为模拟输出的属性和值。 如果为 status 该属性 Failed,则 outputs 特性包括 errors 属性,该属性是一个数组,其中包含一个或多个具有错误信息的错误 message 对象。
< header-values> JSON 作返回的任何标头值
< status-code-returned> 是的 String 作返回的状态代码
< action-status> 是的 String 作的状态,例如, SucceededFailed

例如,在此 HTTP作定义中,属性runtimeConfiguration.staticResult.name在定义作的模拟输出的属性内staticResults引用HTTP0。 该 runtimeConfiguration.staticResult.staticResultOptions 属性指定静态结果设置位于 Enabled HTTP作上。

"actions": {
   "HTTP": {
      "inputs": {
         "method": "GET",
         "uri": "https://www.microsoft.com"
      },
      "runAfter": {},
      "runtimeConfiguration": {
         "staticResult": {
            "name": "HTTP0",
            "staticResultOptions": "Enabled"
         }
      },
      "type": "Http"
   }
},

HTTP作返回定义staticResults中的HTTP0输出。 在此示例中,对于状态代码,模拟输出为 OK。 对于标头值,模拟输出为 "Content-Type": "application/JSON". 对于作的状态,模拟输出为 Succeeded

"definition": {
   "$schema": "<...>",
   "actions": { "<...>" },
   "contentVersion": "<...>",
   "outputs": { "<...>" },
   "parameters": { "<...>" },
   "staticResults": {
      "HTTP0": {
         "outputs": {
            "headers": {
               "Content-Type": "application/JSON"
            },
            "statusCode": "OK"
         },
         "status": "Succeeded"
      }
   },
   "triggers": { "<...>" }
},

Expressions

使用 JSON 时,可以具有设计时存在的文本值,例如:

"customerName": "Sophia Owen",
"rainbowColors": ["red", "orange", "yellow", "green", "blue", "indigo", "violet"],
"rainbowColorsCount": 7

还可以具有在运行时之前不存在的值。 若要表示这些值,可以使用在运行时计算的 表达式。 表达式是一个序列,可以包含一个或多个 函数运算符变量、显式值或常量。 在工作流定义中,可以通过在 JSON 字符串值中的任何位置使用表达式,方法是使用 at-sign (@) 作为表达式前缀。 在计算表示 JSON 值的表达式时,通过删除 @ 字符来提取表达式正文,并且始终生成另一个 JSON 值。

"customerName": "Sophia Owen",
"accountName": "@parameters('customerName')"

通过字符串内插 ,还可以在由 @ 字符和大括号 ({}) 包装的字符串内使用多个表达式。 下面是语法:

@{ "<expression1>", "<expression2>" }

结果始终是一个字符串,使此功能类似于 concat() 函数,例如:

"customerName": "First name: @{parameters('firstName')} Last name: @{parameters('lastName')}"

如果有以 @ 字符开头的文本字符串,请使用另一个 @ 字符作为转义字符前缀 @ 字符:@@

这些示例演示如何计算表达式:

JSON 值 结果
“索菲亚·欧文” 返回以下字符:“索菲亚·欧文”
“array[1]” 返回以下字符:“array[1]”
"@@" 将这些字符作为一个字符字符串返回:“@”
" @" 将这些字符作为双字符字符串返回:'@'

对于这些示例,假设你定义“myBirthMonth”等于“January”和“myAge”等于数字 42:

"myBirthMonth": "January",
"myAge": 42

这些示例演示如何计算以下表达式:

JSON 表达式 结果
“@parameters('myBirthMonth')” 返回以下字符串:“January”
“@{parameters('myBirthMonth')}” 返回以下字符串:“January”
“@parameters('myAge')” 返回此数字:42
“@{parameters('myAge')}” 将此数字作为字符串返回:“42”
“我的年龄是 @{parameters('myAge')}” 返回以下字符串:“我的年龄为 42”
“@concat('我的年龄是',字符串(参数('myAge')))” 返回以下字符串:“我的年龄为 42”
“我的年龄是 @@{parameters('myAge')}” 返回此字符串,其中包含表达式:“我的年龄是 @{parameters('myAge')}'

在工作流设计器中以可视方式工作时,可以使用表达式编辑器创建表达式,例如:

屏幕截图显示了工作流设计器和表达式编辑器。

完成后,表达式会显示在工作流定义中的相应属性,例如, searchQuery 此处的属性:

"Search_tweets": {
  "inputs": {
    "host": {
      "connection": {
        "name": "@parameters('$connections')['x']['connectionId']"
      }
    }
  },
  "method": "get",
  "path": "/searchtweets",
  "queries": {
    "maxResults": 20,
    "searchQuery": "Azure @{concat('firstName','', 'LastName')}"
  }
},

输出

在本 outputs 部分中,定义工作流在运行完成后可以返回的数据。 例如,若要跟踪每个运行中的特定状态或值,请指定工作流输出返回该数据。

备注

当响应来自服务的 REST API 的传入请求时,请勿使用 outputs。 请改用 Response 作类型。 有关详细信息,请参阅 工作流触发器和作

下面是输出定义的常规结构:

"outputs": {
  "<key-name>": {
    "type": "<key-type>",
    "value": "<key-value>"
  }
}
Attribute 必选 类型 Description
< key-name> 是的 String 输出返回值的键名称
< key-type> 是的 int, float, string, securestring, bool, array, JSON 对象 输出返回值的类型
< key-value> 是的 与<键类型相同> 输出返回值

若要从工作流运行中获取输出,请查看 Azure 门户中逻辑应用的运行历史记录和详细信息,或使用 工作流 REST API。 还可以将输出传递给外部系统,例如 Power BI,以便创建仪表板。

运营商

表达式函数中,运算符执行特定任务,例如引用数组中的属性或值。

算子 任务
' 若要将字符串文本用作输入或表达式和函数,请仅用单引号包装字符串,例如 '<myString>'。 不要使用双引号(""),这与整个表达式的 JSON 格式冲突。 例如:

:length('Hello')
:length(“Hello”)

传递数组或数字时,不需要换行标点符号。 例如:

:length([1, 2, 3])
:length(“[1, 2, 3]”)
[] 若要在数组或 JSON 对象内的特定位置(索引)引用值,请使用方括号,例如:

- 获取数组中的第二项:

myArray[1]

- 访问 JSON 对象中的属性:

示例 1
setProperty(<object>, '<parent-property>', addProperty(<object>['<parent-property>'], '<child-property>', <value>)

示例 2
lastIndexOf(triggerBody()?['subject'],'some string')
. 若要引用对象中的属性,请使用点运算符。 例如,若要获取 name JSON 对象的属性 customer

"parameters('customer').name"
? 若要在对象中引用 null 属性而不出现运行时错误,请使用 null-ignore () 运算符。 例如,若要处理触发器中的 null 输出,可以使用以下表达式:

coalesce(trigger().outputs?.body?['<someProperty>'], '<property-default-value>')