在 Azure Logic Apps 中建立、編輯或擴充邏輯應用程式工作流程定義的 JSON

適用於:Azure Logic Apps (使用量)

當您在 Azure Logic Apps 中使用自動化工作流程建立企業整合解決方案時,基礎工作流程定義會針對其描述和驗證,使用簡單的宣告式 JavaScript 物件標記法 (JSON) 及工作流程定義語言 (WDL) 結構描述。 這些格式讓工作流程定義更容易閱讀及了解,且無須很多程式碼方面的知識。 如果您想要自動化邏輯應用程式資源的建立及部署,您可以將工作流程定義納入 Azure Resource Manager 範本中的 Azure 資源。 然後您可以使用 Azure PowerShellAzure CLIAzure Logic Apps REST API 來建立、管理及部署邏輯應用程式。

若要以 JSON 編寫工作流程定義,可以在 Azure 入口網站或 Visual Studio 中開啟程式碼檢視編輯器,或將定義複製到任何您想要的編輯器中。 如果您不熟悉 Azure Logic Apps,請檢閱建立範例使用量邏輯應用程式工作流程

注意

有些 Azure Logic Apps 功能只支援 JSON,不支援工作流程設計工具,例如在工作流程定義中定義參數和多個觸發程序。 因此針對這些工作,您必須使用程式碼檢視或其他編輯器。

編輯 JSON - Azure 入口網站

  1. 登入 Azure 入口網站

  2. 在左側功能表中,選擇 [所有服務]。 在搜尋方塊中尋找「邏輯應用程式」,然後從結果中選取您的邏輯應用程式。

  3. 在邏輯應用程式功能表的 [開發工具] 底下,選取 [邏輯應用程式程式碼檢視]

    程式碼檢視編輯器隨即開啟,並以 JSON 格式顯示您的工作流程定義。

編輯 JSON - Visual Studio

在 Visual Studio 中編寫工作流程定義之前,請先確定您已經安裝必要的工具。 若要使用 Visual Studio 建立邏輯應用程式,請檢閱快速入門:使用 Azure Logic Apps 自動化工作和程序 - Visual Studio

在 Visual Studio 中,您可以開啟直接從 Azure 入口網站建立或部署的邏輯應用程式,或開啟 Visual Studio 中以 Azure Resource Manager 專案形式建立或部署的邏輯應用程式。

  1. 開啟包含邏輯應用程式的 Visual Studio 解決方案或 Azure 資源群組專案。

  2. 尋找並開啟工作流程定義,根據預設,該定義在 Resource Manager 範本中會以 LogicApp.json 的名稱顯示。 您可以使用及自訂此範本,以部署至不同的環境。

  3. 開啟工作流程定義和範本的捷徑功能表。 選取 [以邏輯應用程式設計工具開啟]

    Open logic app in a Visual Studio solution

    提示

    如果您在 Visual Studio 2019 中沒有此命令,請檢查您是否有最新的 Visual Studio 更新。

  4. 在工作流程設計工具底部,選擇 [程式碼檢視]

    程式碼檢視編輯器隨即開啟,並以 JSON 格式顯示您的工作流程定義。

  5. 若要返回設計工具檢視,請在程式碼檢視編輯器的底部,選擇 [設計]

參數

部署生命週期通常有用於開發、測試、預備和生產的不同環境。 當您想要將具有的值在整個邏輯應用程式中重複使用,而不需硬式編碼,或根據您的部署需求而有所不同時,您可以為工作流程定義建立 Azure Resource Manager 範本,以便您也可以將邏輯應用程式部署自動化。

請遵循以下一般步驟來「參數化」,或改為定義並使用這些值的參數。 然後,您可以在將值傳遞至範本的個別參數檔案中提供這些值。 如此一來,您可以更輕鬆地變更這些值,而不必更新和重新部署您的邏輯應用程式。 如需完整詳細資料,請參閱概觀:使用 Azure Resource Manager 範本自動部署邏輯應用程式

  1. 在您的範本中,定義範本參數和工作流程定義參數,以分別接受部署時和執行階段使用的值。

    範本參數是在工作流程定義外部的參數區段中定義的,而工作流程定義參數則是在工作流程定義內部的參數區段中定義的。

  2. 將硬式編碼值取代為參考這些參數的運算式。 範本運算式會使用與工作流程定義運算式不同的語法。

    不要在工作流程定義運算式內部使用範本運算式,以避免使您的程式碼複雜化,因為工作流程定義運算式是在執行階段評估,而範本運算式是在部署時評估。 只在工作流程定義外部使用範本運算式。 只在工作流程定義內部使用工作流程定義運算式。

    指定工作流程定義參數的值時,您可以使用工作流程定義外部的參數區段來參考範本參數,但該區段仍在邏輯應用程式的資源定義內部。 如此一來,您可以將範本參數值傳遞至工作流程定義參數。

  3. 將參數的值儲存在個別的參數檔案中,並隨著您的部署包含該檔案。

使用函式處理字串

Azure Logic Apps 具有各種函式可處理字串。 例如,假設您需要將公司名稱從訂單傳遞至另一個系統。 不過,您不確定字元編碼的正確處理方式。 您可以在這個字串上執行 base64 編碼,但若要避免在 URL 中逸出,您可改為取代數個字元。 此外,公司名稱只需要一個子字串,因為不會用到前五個字元。

{
  "$schema": "https://schema.management.azure.com/schemas/2016-06-01/Microsoft.Logic.json",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "order": {
      "defaultValue": {
        "quantity": 10,
        "id": "myorder1",
        "companyName": "NAME=Contoso"
      },
      "type": "Object"
    }
  },
  "triggers": {
    "request": {
      "type": "Request",
      "kind": "Http"
    }
  },
  "actions": {
    "order": {
      "type": "Http",
      "inputs": {
        "method": "GET",
        "uri": "https://www.example.com/?id=@{replace(replace(base64(substring(parameters('order').companyName,5,sub(length(parameters('order').companyName), 5) )),'+','-') ,'/' ,'_' )}"
      }
    }
  },
  "outputs": {}
}

下列步驟說明此範例從內部到外部處理這個字串的方式:

"uri": "https://www.example.com/?id=@{replace(replace(base64(substring(parameters('order').companyName,5,sub(length(parameters('order').companyName), 5) )),'+','-') ,'/' ,'_' )}"
  1. 取得公司名稱的 length(),以便取得字元總數。

  2. 若要取得較短的字串,請減去 5

  3. 現在取得 substring()。 從索引 5 開始,並移至字串的其餘部分。

  4. 將這個子字串轉換成 base64() 字串。

  5. 現在,以 - 字元 replace() 所有 + 字元。

  6. 最後,以 _ 字元 replace() 所有 / 字元。

將清單項目對應到屬性值,然後使用對應作為參數

若要根據屬性值取得不同的結果,您可以建立可比對每個屬性值與結果的對應,然後使用該對應作為參數。

例如,此工作流程會將某些類別定義為參數,以及定義可比對這些類別與特定 URL 的對應。 首先,工作流程會取得文章清單。 接著,工作流程會使用此對應來尋找符合每篇文章之類別的 URL。

  • intersection() 函式會檢查類別是否符合已定義的知名類別。

  • 取得相符的類別之後,此範例會使用方括號來提取對應中的項目:parameters[...]

{
  "$schema": "https://schema.management.azure.com/schemas/2016-06-01/Microsoft.Logic.json",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "specialCategories": {
      "defaultValue": [
        "science",
        "google",
        "microsoft",
        "robots",
        "NSA"
      ],
      "type": "Array"
    },
    "destinationMap": {
      "defaultValue": {
        "science": "https://www.nasa.gov",
        "microsoft": "https://www.microsoft.com/en-us/default.aspx",
        "google": "https://www.google.com",
        "robots": "https://en.wikipedia.org/wiki/Robot",
        "NSA": "https://www.nsa.gov/"
      },
      "type": "Object"
    }
  },
  "triggers": {
    "Request": {
      "type": "Request",
      "kind": "http"
    }
  },
  "actions": {
    "getArticles": {
      "type": "Http",
      "inputs": {
        "method": "GET",
        "uri": "https://ajax.googleapis.com/ajax/services/feed/load?v=1.0&q=https://feeds.wired.com/wired/index"
      }
    },
    "forEachArticle": {
      "type": "foreach",
      "foreach": "@body('getArticles').responseData.feed.entries",
      "actions": {
        "ifGreater": {
          "type": "if",
          "expression": "@greater(length(intersection(item().categories, parameters('specialCategories'))), 0)",
          "actions": {
            "getSpecialPage": {
              "type": "Http",
              "inputs": {
                "method": "GET",
                "uri": "@parameters('destinationMap')[first(intersection(item().categories, parameters('specialCategories')))]"
              }
            }
          }
        }
      },
      "runAfter": {
        "getArticles": [
          "Succeeded"
        ]
      }
    }
  }
}

使用 Date 函式取得資料

若要從原生不支援「觸發程序」的資料來源取得資料,您可改為使用 Date 函式來處理時間和日期。 例如,這個運算式會尋找這個工作流程從內部到外部的步驟需要花費多少時間:

"expression": "@less(actions('order').startTime,addseconds(utcNow(),-1))",
  1. order 動作,擷取 startTime

  2. 使用 utcNow() 取得目前時間。

  3. 減去一秒:

    addseconds(..., -1)

    您可以使用其他的時間單位,例如 minuteshours

  4. 現在,您可以比較這兩個值。

    如果第一個值小於第二個值,則自從訂單最初提交以來已超過一秒。

若要將日期格式化,您可以使用字串格式器。 例如,若要取得 RFC1123,請使用 utcnow('r')。 深入了解日期格式化

{
  "$schema": "https://schema.management.azure.com/schemas/2016-06-01/Microsoft.Logic.json",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "order": {
      "defaultValue": {
        "quantity": 10,
        "id": "myorder-id"
      },
      "type": "Object"
    }
  },
  "triggers": {
    "Request": {
      "type": "request",
      "kind": "http"
    }
  },
  "actions": {
    "order": {
      "type": "Http",
      "inputs": {
        "method": "GET",
        "uri": "https://www.example.com/?id=@{parameters('order').id}"
      }
    },
    "ifTimingWarning": {
      "type": "If",
      "expression": "@less(actions('order').startTime,addseconds(utcNow(),-1))",
      "actions": {
        "timingWarning": {
          "type": "Http",
          "inputs": {
            "method": "GET",
            "uri": "https://www.example.com/?recordLongOrderTime=@{parameters('order').id}&currentTime=@{utcNow('r')}"
          }
        }
      },
      "runAfter": {
        "order": [
          "Succeeded"
        ]
      }
    }
  },
  "outputs": {}
}

下一步