使用工作流程定義語言描述 Azure Logic Apps 工作流程

已完成

您可以使用 JSON 文件定義 Azure Logic Apps 工作流程的結構和工作流程。 此文件包含組成邏輯應用程式工作流程元素的 JSON 描述,以及驗證其的工作流程定義語言結構描述。 說明結構描述最簡單的方式是檢查在 Azure 入口網站中,使用工作流程設計工具建立的現有工作流程,然後檢視邏輯應用程式的 JSON 描述。

在範例案例中,您想要為您的顧問提供一般工作流程,使其能夠適應所合作之大學的特定需求。 您想要讓自訂和部署每個工作流程變得盡可能簡化,因此您決定要看看工作流程背後的程式碼,也就是工作流程定義 JSON。

工作流程設計工具

工作流程設計工具可讓您以圖形方式建立與偵錯邏輯應用程式的工作流程。 此設計工具也可讓開發人員對工作流程一探究竟,了解其實作方式。 下圖顯示簡單的工作流程範例,將 HTTP GET 要求傳送至指定的 URL 即會觸發此工作流程。 結果會在 HTTP 回應中傳回。 在此範例中,工作流程會傳送回簡單的 Hello Logic Apps Template! 訊息。

工作流程設計工具概觀示意圖。

現在讓我們來看看 JSON 範本所使用的工作流程定義語言。

程式碼檢視

[程式碼檢視] 視窗會顯示描述工作流程的 JSON 文件。 在範例應用程式中,JSON 看起來像這樣:

{
    "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"
            }
        }
    }
}

請注意 definition 範圍中,與設計工具所顯示之動作和觸發程序相關的各區段。 您可以編輯本文件中的 JSON 程式碼,以反映邏輯應用程式工作流程功能中所需的任何變更。 您也可以新增進一步的動作,並指定工作流程中的邏輯如何從一個動作執行到下一個動作。

[觸發程序] 區段

triggers 區段包含觸發程序類型的描述,及其叫用方式。 在此範例中,觸發程序是一個簡單的 HTTP 觸發程序,執行時可回應 HTTP GET 要求。

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

觸發程序必須包含下列元素:

  • 工作流程內的唯一名稱。 在上述範例中,觸發程序的預設名稱是 manual,但您可以將預設名稱更換成更有意義的識別碼。

  • 觸發程序類型。 此類型會指出造成觸發程序執行的事件。 執行 Request 觸發程序可回應 HTTP 要求。 其他可用的觸發程序類型包括:

    • Recurrence,用於建立根據週期性排程執行的觸發程序。

    • HttpWebhook,用於接聽端點上的事件。

    • ApiConnection,用於回應其他 Azure 服務所觸發的事件,例如抵達訊息佇列的訊息、電子郵件訊息等等。 ApiConnection 觸發程序類型經過一般化,而且您可以指定指出服務類型,以及任何所需連線資訊的進一步詳細資料。

  • inputs 區段。 此區段會指定可定義觸發程序行為的資料。 若是 Request 觸發程序,method 會指出造成觸發程序執行的 HTTP 要求類型。 若是 ApiConnection 觸發程序,inputs 區段包含如何連線到觸發事件 (例如,訊息佇列連接字串) 之資源的相關資訊。 如果觸發程序為 Request 觸發程序,則輸入定義的 schema 區段會指定要求本文的承載應該符合的結構描述。 HTTP GET 要求沒有要求本文,因此 schema 在上述範例中是空的。

下列範例會顯示可啟動工作流程並接收 HTTP POST 要求之另一個 Request 觸發程序的定義。 POST 要求通常會提供要求本文,其中包含要張貼的資料。 此範例中的要求本文含有客戶名稱和地址,其中包含街道和縣 (市)。

"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"
                  }
               }
            }
         }
      }
   }
}

觸發程序也可以指定條件。 只有符合這些條件時,才會觸發觸發程序。 您可以在選用的 conditions 區段中定義條件。 例如,您可能只有在要求本文指定 New York 的城市時,才想要執行 mypostrequest 觸發程序 (如上述範例所示):

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

[動作] 區段

邏輯應用程式的 actions 區段會定義工作流程的邏輯和結構。 區段包含一系列動作。 動作是建構工作流程的基本建置組塊。 動作會採用輸入,並產生傳遞至工作流程中下一個動作的輸出。 下表列出不同的可用動作類型:

動作 描述
ApiConnection 將 HTTP 要求傳送至特定的服務。 此動作類型可讓您整合邏輯應用程式工作流程與 Azure 功能,例如,Azure 服務匯流排和 Azure 事件方格等等。 動作需要包含用於存取服務之連接字串的輸入,以及叫用服務所需的其他任何資訊和參數。
Compose 將多個輸入與運算式結合到單一輸出。
Function 讓您呼叫 Azure 函式。
HTTP 將 HTTP 要求傳送到 HTTP 端點,不是 Azure 服務。
Join 採用資料項目的陣列作為輸入,並產生包含這些項目 (以指定的分隔符號分隔) 的字串。
Parse 使用指定的結構描述,將 JSON 文件剖析成一組語彙基元。
Query 使用指定的條件,篩選輸入陣列中的項目。
Response 建立 HTTP 要求的回應。
Table 此動作可以從 JSON 物件的陣列產生 HTML 表格。
Terminate 立即取消工作流程。
Wait 暫停工作流程一段指定的間隔,或直到發生逾時。
Workflow 執行另一個邏輯應用程式工作流程。
Condition 一組動作類型 (ForeachIfSwitchUntil),可讓您以程式設計方式在工作流程中實作控制流程。 您可以逐一查看集合中的項目、根據輸入參數的值進行決策,並在符合某項條件之前執行迴圈。
InitializeVariable
IncrementVariable
DecrementVariable
SetVariable
定義、初始化、指派及修改您能夠在工作流程中的動作項目之間傳遞的變數。

如同觸發程序,每個動作在工作流程中都必須有唯一的名稱。 在下列範例中,預設動作名稱為 Response,但您可以使用有效且更有意義的識別碼。 動作必須有一個 inputs 區段,可指定動作所處理的資料。 在 Response 動作中,您可以指定要在回應訊息中傳回的運算式資料,加上 HTTP 狀態碼。

在基本的工作流程定義中,此動作會產生本文為簡短訊息的 HTTP 回應。

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

runAfter 區段可指出此動作在工作流程順序中執行所在。 在上述範例中,只有單一動作,因此該動作一律會在觸發程序觸發時執行。 如果工作流程有多個動作,您可以指定動作的名稱,以及該動作在此區段的狀態。 如果 runAfter 動作完成時具有指定的狀態,動作會執行。 下列程式碼為範例。 動作 mySecondAction 會在 myFirstAction 之後執行,但只有在 myFirstAction 以狀態 Succeeded 完成時:

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

[輸出] 區段

使用 outputs 區段定義工作流程完成執行時,可以傳回的資料。 您可以追蹤特定狀態或工作流程每次執行的資料。 您可以使用 Azure Logic Apps 執行歷程記錄,從工作流程的每次執行中檢查輸出,其可在 Azure 入口網站或工作流程 REST API 中取得。

outputs 區段的格式看起來像這樣:

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

工作流程運算式

您可以使用工作流程運算式取代任何固定的值、變數或常數。 您也可以在運算式前面加上 (@) 符號,以便在 JSON 字串值中的任何地方放置運算式。 例如,您可以在運算式中使用 @parameters 函式來擷取具名參數的值 (參數會在下一節中說明)。

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

Azure Logic Apps 會提供一組內建函式用以建立複雜的運算式:

  • 字串函式:用於串連或分割字串、轉換大小寫字元,以及搜尋子字串。
  • 集合函式:用於偵測集合是否包含符合特定模式的項目、從集合擷取項目,以及合併集合。
  • 邏輯比較函式:用於偵測運算元是否相同、不同、在數字上大於,或在數字上小於彼此。
  • 轉換函式:用於變更資料的類型或格式。
  • 數學函式:例如 addsubdivmul,以及數個其他項目。
  • 日期和時間函式:用於剖析和處理日期和時間。
  • 工作流程函式:用於擷取傳遞至工作流程動作之資料的相關資訊。 例如,parameter 函式 (先前顯示) 會擷取具名參數的值,而 body 函式 (先前顯示) 會傳回動作所產生的資料。
  • JSON 和 XML 操作函式:用於剖析和處理 JSON 和 XML 文件。

您可以在 InitializeVariable 動作的 inputs 區段定義變數,而且您可以使用運算式操作這些變數。 使用 variables 函式讀取變數的值。 下列範例會使用 InitializeVariable 動作來建立名為 myIntegerVariable 的整數變數,並將其初始化為 99。 此範例也會顯示具有 If 類型的 Condition 動作。 條件會使用運算式來測試 myIntegerVariable 變數值,如果符合 100 這個值,條件會使用 HTTP 動作執行 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"
    }
}

[參數] 區段

parameters 區段可讓您將工作流程參數化。 在執行階段,您可以為每個參數提供值。 您可以在可能會使用常數或運算式所在工作流程的任何位置中參考參數。

您可以新增含有預設值的參數定義。 如果您未在執行階段提供參數的值,則會使用預設值。 下列範例示範如何定義名為 cityParam 的參數。 參數會在 mypostrequest 動作的條件內使用。 只有在要求文件包含符合參數值的城市時,才會執行動作。 預設參數值為 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"
            }
        }
    }
}

檢定您的知識

1.

您希望 Azure Logic Apps 工作流程每三分鐘執行一次。 您要在下列哪個工作流程定義區段中定義這個週期性行為?

2.

您可以在工作流程定義的哪一個區段,將回應傳送到 HTTP 要求,進而傳回訊息本文、狀態碼與訊息標頭?

3.

您會在工作流程定義的哪一個區段指定工作流程完成時要傳回的值?