在 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 |
在工作流定义中, triggers
和 actions
部分定义工作流执行期间发生的调用。 有关这些部分的语法和详细信息,请参阅 工作流触发器和作。
部署生命周期通常具有不同的开发、测试、过渡和生产环境。 将逻辑应用部署到各种环境时,可能需要根据部署需求使用不同的值,例如连接字符串。 或者,你可能希望在整个逻辑应用中重复使用的值,而无需进行硬编码或经常更改。 在工作流定义的 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 注意:对于所有密码、密钥和机密,请使用 securestring 或 secureobject 类型,因为 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> | 是的 | 不同 | 这些属性的要求因不同的条件而异。 例如,当为 status 该 Succeeded 属性时,该 outputs 属性包括作返回为模拟输出的属性和值。 如果为 status 该属性 Failed ,则 outputs 特性包括 errors 属性,该属性是一个数组,其中包含一个或多个具有错误信息的错误 message 对象。 |
< header-values> | 否 | JSON | 作返回的任何标头值 |
< status-code-returned> | 是的 | String | 作返回的状态代码 |
< action-status> | 是的 | String | 作的状态,例如, Succeeded 或 Failed |
例如,在此 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": { "<...>" }
},
使用 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>') |