تَمرِين - استخدَام التعليمَات البرمجية المخصصة
فِي هذَا التَمرِين، ستضيف عملية جَدِيدة إلى مُوصِّلِ مخصص موجود. بَعد ذلك، ستستخدم رمزًا مخصصًا لتطبيق العملية وتحويل الاستجَابة.
سَوفَ تتَمكن ممَا يلي بتعديل مُوصِّلِ Contoso Invoicing المخصص الذي يحتوي عَلى تشغيل ListInvoice ولكن لا يحتوي عَلى عملية LastInvoice. نتيجة لذلك، ستضيف عملية LastInvoice لاستردَاد أحدث فَاتورة تم إنشَاؤهَا. لا تدعم واجهة برمجة تَطبِيقَات الشبكة لـ Contoso Invoicing هَذه العملية، لذَا فإنك تستخدم تعليمة برمجية مخصصة تعمل فِي عملية LastInvoice لإعَادة توجيه الطلب إلى ListInvoice عَلى API، ثم تقوم بتحويل الاستجَابة للعودة إلى الفَاتورة الأخيرة التي تم إنشَاؤهَا.
مهم
استخدم بيئة اختبار معَ توفِير Microsoft Dataverse. إذَا لم يكن لديك واحد بالفعل، فَانتقِل إلى خطة المطور فِي Microsoft Power Apps للاشترَاك فِي خطة المطور.
المهمة: إعدَاد بيئتك
فِي هَذه المهمة، سَوفَ تتَمكن ممَا يلي باستيرَاد حَل إلى البيئة الخَاصة بك.
انتقِل إلى Microsoft Power Automate وتأكد من أنك فِي البيئة الصَحِيحة.
حدد المزيد فِي جزء التنقل الأيسر ثم حدد زر اكتشَاف الكل.
حدد خيَار المُوصِّلات المُخصَّصة ضِمن البيَانات. قد تحتَاج إلى التمرير للأسفل لرؤية هَذا.
تحقق من أن لديك بالفعل مُوصِّلِ Contoso Invoicing المخصص فِي بيئتك.
إذَا كَان لديك بالفعل مُوصِّلِ Contoso Invoicing المخصص فِي بيئتك، فَانتقِل إلى المهمة التَالِية فِي هذَا التَمرِين. إذَا لم يكن لديك المُوصِّلِ المخصص، فتَابع إلى الخطوة 6.
حدد الحلول > استيرَاد.
حدد استعرَاض.
حدد الحَل ContosoInvoicingExtensions_1_0_0_0.zip الموجود فِي مجلد الموارد، ثم حدد فتح.
حدد التَالِي.
حدد استيرَاد ثم انتظر حتى يكتمل الاستيرَاد. من المفترض أن تتلقى رسَالة نجَاح بَعد اكتمَال الاستيرَاد.
حدد نشر جميع التوزيعَات وانتظر حتى اكتمَال النشر. لا تُغَادِر هَذه الصَفحَة.
المهمة: إنشَاء عملية LastInvoice
فِي هَذه المهمة، سَوفَ تتَمكن ممَا يلي بإنشَاء عملية جَدِيدة فِي مُوصِّلِ Contoso Invoicing المخصص.
حدد حَل Contoso Invoicing - Extensions الذي قمت باستيرَاده. من المفترض أن يظهر مكون المُوصِّلِ المخصص Contoso Invoicing - Extensions.
حدد المُوصِّلِ Contoso Invoicing - Extensions ثم حدد تحرير. قد لا يحتوي المُوصِّلِ عَلى ملحقَات فِي الاسم إذَا قمت بإنشَائه من تَمرِين مختلف، وهذَا أمر جيد.
حدد علامة التبويب التعريف، ثم حدد إضَافة إجرَاء جَدِيد.
انتقِل إلى قسم الطلب وحدد إضَافة استيرَاد من العينة.
من قسم الفعل، حدد Get، والصق
https://contosoinvoicingtest.azurewebsites.net/GetLastInvoiceفِي مربع URL، ثم حدد استيرَاد.قم بالتمرير لأسفل إلى قسم الاستجَابة ثم حدد إضَافة إضَافَة استجَابة افترَاضية.
الصق JSON التَالِي فِي حقل النص ثم حدد استيرَاد.
{ "invoiceId": "1934", "date": "2023-03-19T06:55:45.9039452+00:00", "createDate": "2023-03-14T06:55:45.9039456Z", "amount": 8000, "accountId": "1001", "accountName": "Wing Tips", "status": "Invoiced", "typeId": 1, "purchaseOrderId": "3004", "tags": "New Account;Special Pricing;Non-returnable" }حدد علامة التبويب اختبار، وحدد تحديث المُوصِّلِ، ثم انتظر حتى يكتمل التحديث.
ابدَأ العمل فِي علامة تبويب أو نَافذة مستعرض جَدِيدة، ثم انتقِل إلى Contoso Invoicing.
حدد ارتباط مفتَاح API.
انسخ مفتَاح API.
احفظ هذَا المفتَاح فِي المفكرة.
ارجع إلى المُوصِّلِ، وحدد علامة التبويب اختبار، ثم حدد إضَافة اتصَال جَدِيد.
الصق المفتَاح الذي قمت بنسخه فِي الحقل مفتَاح API، ثم حدد إنشَاء اتصَال.
حدد تحديثالاتصَالات.
قم بالتمرير لأسفل إلى قسم العَمَليَات وحدد GetLastInvoice، ثم حدد اختبار التشغيل.
يجب أن تحصل عَلى خطأ 404 لأن واجهة برمجة التَطبِيقَات لا تحتوي عَلى عملية GetLastInvoice.
لا تُغَادِر هَذه الصَفحَة.
مهمة: إضَافَة تعليمة برمجية إلى المُوصِّلِ
فِي هَذه المهمة، ستضيف التعليمة البرمجية التي تنفذ عملية GetLastInvoice.
حدد علامة التبويب تعليمة برمجية، ثم قم بتشغيل خيَار التبديل تمكين التعليمة البرمجية.
حدد القَائمة المنسدلة عَمليَات، ثم حدد عملية GetLastInvoice.
الصق التعليمة البرمجية التَالِية فِي حقل التعليمة البرمجية، ثم حدد علامة التبويب اختبار.
public class Script : ScriptBase { public override async Task<HttpResponseMessage> ExecuteAsync() { // Check if the operation ID matches what is specified in the OpenAPI definition of the connector if (String.Equals(this.Context.OperationId, "GetLastInvoice", StringComparison.OrdinalIgnoreCase)) { this.Context.Request.RequestUri = ReplaceUri(this.Context.Request.RequestUri, "GetLastInvoice", "ListInvoices"); return await this.HandleGetLastInvoiceOperation().ConfigureAwait(false); } else { //pass-thru any other operation to the API directly return await this.HandleForwardOperation().ConfigureAwait(false); } } private Uri ReplaceUri(Uri original, string fromValue, string toValue) { try { var builder = new UriBuilder(original.ToString().Replace(fromValue, toValue)); return builder.Uri; } catch (Exception ex) { throw new Exception(original.ToString().Replace(fromValue, toValue)); } } private async Task<HttpResponseMessage> HandleGetLastInvoiceOperation() { JObject newResult = null; // Use the context to send an HTTP request HttpResponseMessage response = await this.Context.SendAsync(this.Context.Request, this.CancellationToken).ConfigureAwait(continueOnCapturedContext: false); // Do the transformation if the response was successful, otherwise return error responses as-is if (response.IsSuccessStatusCode) { if (response.StatusCode == HttpStatusCode.OK) { var responseString = await response.Content.ReadAsStringAsync().ConfigureAwait(continueOnCapturedContext: false); var result = JObject.Parse(responseString); // Wrap the original JSON object into a new JSON object with just two properties if (result != null && result.ContainsKey("invoices") && result["invoices"].HasValues) { var sortedArray = result["invoices"].OrderBy(jo => (DateTime)jo["date"]).ToArray(); var lastInvoice = sortedArray[0]; newResult = new JObject { ["invoiceid"] = lastInvoice["invoiceid"], ["date"] = lastInvoice["date"], ["createDate"] = lastInvoice["createDate"], ["amount"] = lastInvoice["amount"], ["accountId"] = lastInvoice["accountId"], ["accountName"] = lastInvoice["accountName"], ["status"] = lastInvoice["status"], ["typeId"] = lastInvoice["typeId"], ["purchaseOrderId"] = lastInvoice["purchaseOrderId"], ["tags"] = lastInvoice["tags"] }; } else { newResult = new JObject { ["invoiceid"] = "-9999", ["status"] = "No Invoices", }; } } else { newResult = new JObject { ["invoiceid"] = "-9999", ["status"] = "Error retrieving invoices", }; } response.Content = CreateJsonContent(newResult.ToString()); response.StatusCode = HttpStatusCode.OK; } return response; } private async Task<HttpResponseMessage> HandleForwardOperation() { // Use the context to forward/send an HTTP request HttpResponseMessage response = await this.Context.SendAsync(this.Context.Request, this.CancellationToken).ConfigureAwait(continueOnCapturedContext: false); return response; } }رَاجع التعليمة البرمجية. يجب أن تحتوي التعليمة البرمجية عَلى المنطق التَالِي:
للتحقق ممَا إذَا كَانت عملية GetLastInvoice، وإذَا لم تكن كذلك، فإنهَا تعيد توجيه الطلب غير المعدل إلى واجهة برمجة تَطبِيقَات (API) الشبكة
تغيير طلب استخدَام عملية ListInvoice عَلى واجهة برمجة تَطبِيقَات (API) الشبكة
استدعَاء واجهة برمجة تَطبِيقَات (API) الشبكة باستِخدَام SendAsync
تحويل الاستجَابة لتضمين كَائن فَاتورة واحد كَان أحدث فَاتورة تم إنشَاؤهَا
حدد علامة التبويب اختبار، وحدد تحديث المُوصِّلِ، ثم انتظر حتى يكتمل التحديث.
قم بالتمرير لأسفل إلى قسم العَمَليَات وحدد GetLastInvoice، ثم حدد اختبار التشغيل.
ستحصل عَلى استجَابة تُظهر الفَاتورة الأخيرة.