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

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

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

ملاحظة

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

Edit JSON - Azure portal

  1. تسجيل الدخول إلى ⁧⁩مدخل 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 Resource Group، الذي يحتوي على تطبيق المنطق.

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

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

    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. قم بتخزين قيم المعلمات الخاصة بك في ملف معلمة منفصل وقم بتضمين هذا الملف مع النشر.

سلاسل العمليات مع الدالات

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

    إذا كانت القيمة الأولى أقل من القيمة الثانية ، فقد مرت أكثر من ثانية واحدة منذ وضع الأمر لأول مرة.

لتنسيق التواريخ، يمكنك استخدام سلسلة formatters. على سبيل المثال ، للحصول على 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": {}
}

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