قم بإنشاء أو تحرير أو تمديد JSON لتعريفات سير عمل التطبيق المنطقي في تطبيقات Azure Logic

وينطبق ذلك على: Azure Logic Apps (الاستهلاك)

عند إنشاء حلول تكامل المؤسسة باستخدام مهام سير عمل مؤتمتة في Azure Logic Apps، فإن تعريفات سير العمل الأساسية تستخدم JavaScript Object Notation (JSON) بسيطًا وتوضيحيًا بجانب مخطط لغة تعريف سير العمل (WDL) لوصفها والتحقق من صحتها. تجعل هذه التنسيقات تعريفات سير العمل أسهل في القراءة والفهم دون معرفة الكثير عن التعليمات البرمجية. إذا أردت أتمتة إنشاء موارد تطبيقات المنطق وتوزيعها، يمكنك تضمين تعريفات سير العمل مثل موارد Azure داخل قوالب Azure Resource Manager. لإنشاء تطبيقات منطقية وإدارتها وتوزيعها، يمكنك بعد ذلك استخدام Azure PowerShell أو Azure CLI أو Azure Logic Apps REST APIs.

للعمل مع تعريفات سير العمل في JSON، افتح محرر "عرض التعليمات البرمجية" عند العمل في مدخل Microsoft Azure أو في Visual Studio، أو انسخ التعريف إلى أي محرر تريده. إذا كنت جديدا على Azure Logic Apps، فراجع إنشاء مثال سير عمل تطبيق منطق الاستهلاك.

ملاحظة

بعض إمكانات Azure Logic Apps، مثل تحديد المعلمات والمُشغلات المتعددة في تعريفات سير العمل، تتوفر فقط في JSON وليس في مصمم سير العمل. لذلك بالنسبة لهذه المهام، يجب أن تعمل في Code View أو محرر آخر.

تحرير مدخل JSON - Azure

  1. تسجيل الدخول إلى ⁧⁩مدخل Microsoft Azure⁧⁩.

  2. من القائمة اليمنى، اختر جميع الخدمات. في مربع البحث، ابحث عن "تطبيقات المنطق"، ثم من النتائج، حدد تطبيق المنطق الخاص بك.

  3. في قائمة تطبيق المنطق، ضمن أدوات التطوير، حدد عرض رمز تطبيق المنطق.

    يفتح محرر "عرض التعليمات البرمجية" ويعرض تعريف سير العمل بتنسيق JSON.

تحرير JSON - Visual Studio

قبل أن تتمكن من العمل على تعريف سير العمل في Visual Studio، تأكد من تثبيت الأدوات المطلوبة. لإنشاء تطبيق منطقي باستخدام Visual Studio، راجع التشغيل السريع: أتمتة المهام والعمليات باستخدام Azure Logic Apps - Visual Studio.

في Visual Studio، يمكنك فتح التطبيقات المنطقية التي تم إنشاؤها وتوزيعها إما مباشرة من مدخل Azure أو كمشاريع Azure Resource Manager من Visual Studio.

  1. افتح حل Visual Studio، أو مشروع مجموعة موارد Azure، الذي يحتوي على تطبيقك المنطقي.

  2. ابحث عن تعريف تطبيق سير العمل وافتحه، والذي يظهر افتراضيًا في قالب إدارة الموارد، المسمى LogicApp.json. يمكنك استخدام هذا القالب وتخصيصه للتوزيع في بيئات مختلفة.

  3. افتح القائمة المختصرة لتعريف سير العمل والقالب. تحديد فتح باستخدامLogic App Designer.

    افتح تطبيق المنطق في حل Visual Studio

    تلميح

    في حالة عدم امتلاك هذا الأمر فيVisual Studio 2019، فيجب التحقق من وجود آخر تحديثات Visual Studio.

  4. في الجزء السفلي من مصمم سير العمل، اختر "عرض التعليمات البرمجية".

    يفتح محرر "عرض التعليمات البرمجية" ويعرض تعريف سير العمل بتنسيق JSON.

  5. للعودة إلى عرض المصمم، بأسفل محرر Code View، اختر تصميم.

المعلمات

عادة ما تحتوي دورة حياة التوزيع على بيئات مختلفة للتطوير والاختبار والتقسيم المرحلي والإنتاج. عندما يكون لديك قيم تريد إعادة استخدامها في جميع أنحاء تطبيق المنطق الخاص بك بدون تشفير ثابت أو التي تختلف بناءً على احتياجات التوزيع الخاصة بك، يمكنك إنشاء قالب 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"
        ]
      }
    }
  }
}

الحصول على البيانات مع وظائف التاريخ

للحصول على بيانات من مصدر بيانات لا يدعم المشغلات في الأصل، يمكنك استخدام وظائف التاريخ للعمل مع الأوقات والتواريخ بدلاً من ذلك. على سبيل المثال، يكتشف هذا التعبير المدة التي تستغرقها خطوات سير العمل، والعمل من الداخل إلى الخارج:

"expression": "@less(actions('order').startTime,addseconds(utcNow(),-1))",
  1. من الإجراء order، استخرج startTime.

  2. احصل على الوقت الحالي مع utcNow().

  3. اطرح ثانية واحدة:

    addseconds(..., -1)

    يمكنك استخدام وحدات زمنية أخرى، مثل minutes أو hours.

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

الخطوات التالية