تمرين - إضافة منطق إلى تطبيق الوظيفة
لنواصل مثال محرك التروس، ونضف منطقًا لخدمة درجة الحرارة. على وجه التحديد، سوف نتلقى بيانات من طلب HTTP.
متطلبات الوظيفة
أولاً، نحن بحاجة إلى تحديد بعض المتطلبات لمنطقنا:
- درجات الحرارة من 0 إلى 25 درجة يجب أن تكون معلَّمة ك OK.
- درجات الحرارة فوق 25 وصولاً إلى 50 درجة يجب أن تكون معلَّمة على أنها CAUTION.
- وينبغي وضع علامات على درجات الحرارة فوق 50 درجة على أنها DANGER.
إضافة وظيفة إلى تطبيق الوظائف
كما وصفنا في الوحدة السابقة، يوفر Azure قوالب تساعدك في بدء إنشاء وظائف. في هذه الوحدة، يمكنك استخدام القالب HttpTrigger لتنفيذ خدمة درجة الحرارة.
في التمرين السابق، قمت بتوزيع تطبيق الوظائف الخاص بك وفتحته. إذا لم تكن مفتوحة بالفعل، يمكنك فتحه من الصفحة الرئيسية عن طريق تحديد All resources، ومن ثم تحديد تطبيق الدالة الخاصة بك، ونستدعي شيء مثل escalator-functions-xxx.
في شاشة Function App ضمن علامة التبويب FunctionsCreate في مدخل Microsoft Azure، حدد Create Function. يظهر جزء Create Function.
ضمن تحديد قالب، حدد مشغل HTTP وحدد التالي.
اترك اسم الدالة ك HttpTrigger1 ومستوى التخويل كدالة، وحدد إنشاء. يتم إنشاء الدالة HttpTrigger1 وعرضها في جزء الدالة HttpTrigger1 .
حدد علامة التبويب Code + Test. يفتح محرر التعليمات البرمجية، ويعرض محتويات ملف التعليمات البرمجية index.js لدالتك. تظهر التعليمات البرمجية الافتراضية التي أنشئت في قالب HTTP في القصاصة البرمجية التالية.
module.exports = async function (context, req) { context.log('JavaScript HTTP trigger function processed a request.'); const name = (req.query.name || (req.body && req.body.name)); const responseMessage = name ? "Hello, " + name + ". This HTTP triggered function executed successfully." : "This HTTP triggered function executed successfully. Pass a name on the query string or in the request body for a personalized response."; context.res = { // status: 200, /* Defaults to 200 */ body: responseMessage }; }تتوقع وظيفتنا أن يتم تمرير الاسم إما من خلال سلسلة استعلام طلب HTTP، أو كجزء من نص الطلب. تستجيب الدالة من خلال إعادة الرسالة Hello, <name>. يتم تنفيذ دالة HTTP تم تشغيلها بنجاح.، إعادة ترديد name المرسل في الطلب.
من القائمة المنسدلة للملف المصدر، حدد function.json لعرض تكوين الدالة، والتي يجب أن تبدو مثل التعليمات البرمجية التالية.
{ "bindings": [ { "authLevel": "function", "type": "httpTrigger", "direction": "in", "name": "req", "methods": [ "get", "post" ] }, { "type": "http", "direction": "out", "name": "res" } ] }يعلن هذا التكوين أن الدالة تعمل عند تلقى طلب HTTP. يعلن ربط الإخراج أن الاستجابة يتم إرسالها كاستجابة HTTP.
في قسم تفاصيل قالب، في الحقل اسم الدالة، أدخل DriveGearTemperatureService. اترك Authorization level على Function، ثم اختر Create لإنشاء الوظيفة. نظرة عامة على جزء DriveGearTemperatureService لتطبيق الوظيفة.
في قائمة الوظيفة، اختر Code + Test. يتم فتح محرر التعليمات البرمجية مع محتويات ملف التعليمات البرمجية run.ps1. يتم إدراج الرمز الافتراضي الذي تم إنشاؤه من أجلنا في المقتطف التالي.
using namespace System.Net # Input bindings are passed in via param block. param($Request, $TriggerMetadata) # Write to the Azure Functions log stream. Write-Host "PowerShell HTTP trigger function processed a request." # Interact with query parameters or the body of the request. $name = $Request.Query.Name if (-not $name) { $name = $Request.Body.Name } $body = "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response." if ($name) { $body = "Hello, $name. This HTTP triggered function executed successfully." } # Associate values to output bindings by calling 'Push-OutputBinding'. Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{ StatusCode = [HttpStatusCode]::OK Body = $body })تتوقع وظيفتنا أن يتم تمرير الاسم إما من خلال سلسلة استعلام طلب HTTP، أو كجزء من نص الطلب. يجب إنشاء وظائف HTTP استجابة عن طريق الكتابة إلى ربط الإخراج الخاص بهم، والذي يتم إنجازه في PowerShell الوظائف مع
Push-OutputBindingcmdlet. تُظهر هذه الوظيفة الرسالة مرحبًا، $الاسم، مع تكرار الاسم الذي تم إرساله في الطلب.ومن القائمة المنسدلة المصدر، حدد "function.json" لعرض تكوين الوظيفة، والذي يجب أن يبدو كما يلي.
{ "bindings": [ { "authLevel": "function", "type": "httpTrigger", "direction": "in", "name": "Request", "methods": [ "get", "post" ] }, { "type": "http", "direction": "out", "name": "Response" } ] }يعلن هذا التكوين أن الوظيفة تعمل عندما تتلقى طلب HTTP. يعلن ربط الإخراج أن الاستجابة يتم إرسالها كاستجابة HTTP.
اختبار الوظيفة
تلميح
cURL هي أداة سطر أوامر يمكن استخدامها لإرسال الملفات أو استقبالها. إنه مضمن في Linux وmacOS وWindows 10، ويمكن تنزيله لمعظم أنظمة التشغيل الأخرى. يدعم cURL العديد من البروتوكولات مثل HTTP وHTTPS وFTP وFTPS وSFTP وLDAP وTELNET وSMTP وPOP3 وهكذا. لمزيد من المعلومات، راجع الروابط التالية:
لاختبار الوظيفة، يمكنك إرسال طلب HTTP إلى عنوان URL الخاص بالوظيفة باستخدام cURL على سطر الأوامر.
وسِّع إطار Logs في الجزء السفلي من جزء دالة المشغل. حدد Filesystem Logs في القائمة المنسدلة في أعلى إطار Logs. يجب أن يبدأ إطار السجل في تجميع إعلامات التتبع كل دقيقة.
للبحث عن عنوان URL نقطة النهاية للدالة، من شريط الأوامر، حدد Get function URLكما هو موضح في الصورة التالية. احفظ الارتباط _master (مفتاح المضيف) عن طريق تحديد أيقونة Copy to clipboard في نهاية عنوان URL. قم بتخزين هذا الرابط في المفكرة أو تطبيق مشابه لاستخدامه لاحقاً.
افتح موجه الأوامر وقم بتشغيل cURL لإرسال طلب HTTP إلى عنوان URL للوظيفة. ضع في اعتبارك استخدام عنوان URL الذي نسخته في الخطوة السابقة.
curl "<your-https-url>"تلميح
قد تحتاج إلى تضمين عنوان URL في علامات اقتباس لتجنب المشكلات المتعلقة بالأحرف الخاصة في عنوان URL.
إذا كنت تستخدم Windows، فقم بتشغيلcURLمن موجه الأوامر. يحتوي PowerShell على أمر curl ، ولكنه اسم مستعار ل Invoke-WebRequest، وهو ليس نفسcURL.يجب أن تبدو الاستجابة كما يلي.
This HTTP triggered function executed successfully. Pass a name on the query string or in the request body for a personalized response.مرر الآن اسما في الطلب. للقيام بذلك، تحتاج إلى إضافة معلمة سلسلة استعلام تسمى
nameإلى عنوان URL. يضيف المثال التالي معلمةname=Azureسلسلة الاستعلام .curl "<your-https-url>&name=Azure"يجب أن تبدو الاستجابة كما يلي.
Hello, Azure. This HTTP triggered function executed successfully.تم تنفيذ الدالة بنجاح وأرجعت الاسم الذي قمت بتمريره في الطلب.
تأمين مشغلات HTTP
تتيح مشغلات HTTP استخدام مفاتيح واجهة برمجة التطبيقات لحظر المتصلين غير المعروفين من خلال طلب وجود المفتاح في كل طلب. عند إنشاء وظيفة، حدد authorization level. بشكل افتراضي، يتم تعيين المستوى إلى Function، والذي يتطلب مفتاح API خاص بالدالة. يمكن أيضا تعيينه إلى المسؤول لاستخدام مفتاح "رئيسي" عام، أو مجهول للإشارة إلى عدم الحاجة إلى مفتاح. يمكنك أيضًا تغيير مستوى التخويل خلال خصائص الوظيفة بعد الإنشاء.
لأنك حددت الوظيفة عندما أنشأت هذه الوظيفة، فستحتاج إلى توفير المفتاح عندما ترسل طلب HTTP. يمكنك إرساله كمعلمة سلسلة استعلام تسمى code. أو استخدم الأسلوب المفضل ومرره كعنوان HTTP يسمى x-functions-key.
للعثور على مفاتيح الدالة، افتح قائمة Code + Test عن طريق تحديد اسم الدالة (على سبيل المثال، HttpTriger1) ضمن علامة التبويب Functions في قائمة Overview . ثم حدد علامة التبويب Function Keys .
يتم إخفاء قيمة مفتاح الوظيفة بشكل افتراضي. إظهار قيمة مفتاح الدالة الافتراضية عن طريق تحديد Show value. انسخ محتويات حقل القيمة إلى الحافظة، ثم قم بتخزين هذا المفتاح في المفكرة أو تطبيق مشابه لاستخدامه لاحقا.
لاختبار الدالة باستخدام مفتاح الدالة، افتح موجه أوامر وقم بتشغيل cURL لإرسال طلب HTTP إلى عنوان URL للدالة. استبدل
<your-function-key>بقيمة مفتاح الدالة التي حفظتها، واستبدل<your-https-url>بعنوان URL للدالة.curl --header "Content-Type: application/json" --header "x-functions-key: <your-function-key>" --request POST --data "{\"name\": \"Azure Function\"}" <your-https-url>راجع الأمر cURL وتحقق من احتوائه على القيم التالية:
- إضافة
Content-Typeقيمة رأس من النوعapplication/json. - تم تمرير مفتاح الوظيفة كقيمة رأس
x-functions-key. - استخدم طلب
POST. - عليك تمرير Azure Function باستخدام عنوان URL الخاص بوظيفتك.
- إضافة
تحقق من السجلات.
يجب أن يفتح جزء Code + Test جلسة تعرض إخراج ملف السجل (تأكد من تحديد Filesystem Logs في القائمة المنسدلة في أعلى جزء Logs). يتم تحديث ملف السجل بحالة طلبك، والتي يجب أن تبدو كما يلي:
```output
2022-02-16T22:34:10.473 [Information] Executing 'Functions.HttpTrigger1' (Reason='This function was programmatically called via the host APIs.', Id=4f503b35-b944-455e-ba02-5205f9e8b47a)
2022-02-16T22:34:10.539 [Information] JavaScript HTTP trigger function processed a request.
2022-02-16T22:34:10.562 [Information] Executed 'Functions.HttpTrigger1' (Succeeded, Id=4f503b35-b944-455e-ba02-5205f9e8b47a, Duration=114ms)
```
```output
2022-02-16T21:07:11.340 [Information] INFORMATION: PowerShell HTTP trigger function processed a request.
2022-02-16T21:07:11.449 [Information] Executed 'Functions.DriveGearTemperatureService' (Succeeded, Id=25e2edc3-542f-4629-a152-cf9ed99680d8, Duration=1164ms)
```
إضافة منطق تسلسل العمل إلى الوظيفة
دعنا نضيف المنطق إلى الوظيفة، للتحقق من قراءات درجة الحرارة التي تتلقاها، وتعيين حالة لكل قراءة لدرجة الحرارة.
تتوقع وظيفتنا الحصول على مجموعة من قراءات درجة الحرارة. مقتطف JSON التالي هو مثال على نص الطلب الذي نرسله إلى وظيفتنا. قد يختلف اسم الصفيف قليلا ل JavaScript أو PowerShell، ولكن كل إدخال في الصفيف له معرف وطوابع زمنية ودرجة حرارة.
{
"Readings": [
{
"driveGearId": 1,
"timestamp": 1534263995,
"temperature": 23
},
{
"driveGearId": 3,
"timestamp": 1534264048,
"temperature": 45
},
{
"driveGearId": 18,
"timestamp": 1534264050,
"temperature": 55
}
]
}
دعونا نستبدل التعليمات البرمجية الافتراضية في وظيفتنا بالتعليمات البرمجية التالية التي تنفذ منطق عملنا.
في جزء الدالة HttpTrigger1، افتح الملف index.js، واستبدله بالتعليمات البرمجية التالية. بعد إجراء هذا التغيير، على شريط الأوامر، حدد حفظ لحفظ التحديثات إلى الملف.
module.exports = function (context, req) {
context.log('Drive Gear Temperature Service triggered');
if (req.body && req.body.readings) {
req.body.readings.forEach(function(reading) {
if(reading.temperature<=25) {
reading.status = 'OK';
} else if (reading.temperature<=50) {
reading.status = 'CAUTION';
} else {
reading.status = 'DANGER'
}
context.log('Reading is ' + reading.status);
});
context.res = {
// status: 200, /* Defaults to 200 */
body: {
"readings": req.body.readings
}
};
}
else {
context.res = {
status: 400,
body: "Please send an array of readings in the request body"
};
}
context.done();
};
يعتبر المنطق الذي أضفناه واضحًا. نحن نكرر الصفيف، ونضبط الحالة على OK، أو CAUTION، أو DANGER بناءً على قيمة حقل درجة الحرارة. ثم نقوم بإرسال مجموعة من القراءات مع حقل الحالة المضافة إلى كل إدخال.
لاحظ عبارات Log عند توسيع Logs في الجزء السفلي من اللوحة. عند تشغيل الدالة، تضيف هذه العبارات رسائل في نافذة السجلات.
اختبار منطق أعمالنا
سنستخدم ميزة Test/Run في Developer>Code + Test لاختبار الدالة.
في علامة التبويب Code + Test ، حدد Test/Run. في علامة التبويب Input، استبدل محتويات مربع النص Body بالتعليمة البرمجية التالية لإنشاء طلب العينة.
{ "readings": [ { "driveGearId": 1, "timestamp": 1534263995, "temperature": 23 }, { "driveGearId": 3, "timestamp": 1534264048, "temperature": 45 }, { "driveGearId": 18, "timestamp": 1534264050, "temperature": 55 } ] }
افتح الملف run.ps1 واستبدل المحتويات بالتعليمات البرمجية التالية. بعد إجراء هذا التغيير، على شريط الأوامر، حدد حفظ لحفظ التحديثات إلى الملف.
using namespace System.Net
param($Request, $TriggerMetadata)
Write-Host "Drive Gear Temperature Service triggered"
$readings = $Request.Body.Readings
if ($readings) {
foreach ($reading in $readings) {
if ($reading.temperature -le 25) {
$reading.Status = "OK"
}
elseif ($reading.temperature -le 50) {
$reading.Status = "CAUTION"
}
else {
$reading.Status = "DANGER"
}
Write-Host "Reading is $($reading.Status)"
}
$status = [HttpStatusCode]::OK
$body = $readings
}
else {
$status = [HttpStatusCode]::BadRequest
$body = "Please send an array of readings in the request body"
}
Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
StatusCode = $status
Body = $body
})
يعتبر المنطق الذي أضفناه واضحًا. نحن نكرر الصفيف، ونضبط الحالة على OK، أو CAUTION، أو DANGER بناءً على قيمة حقل درجة الحرارة. ثم نقوم بإرسال مجموعة من القراءات مع حقل الحالة المضافة إلى كل إدخال.
لاحظ الاستدعاءات إلى Write-Host cmdlet. عند تشغيل الدالة، تضيف هذه العبارات رسائل في نافذة السجلات.
اختبار منطق العمل
سنستخدم ميزة Test/Run في Developer>Code + Test لاختبار الدالة.
في علامة التبويب Code + Test ، حدد Test/Run. في علامة التبويب Input، استبدل محتويات مربع النص Body بالتعليمة البرمجية التالية لإنشاء طلب العينة.
{ "Readings": [ { "driveGearId": 1, "timestamp": 1534263995, "temperature": 23 }, { "driveGearId": 3, "timestamp": 1534264048, "temperature": 45 }, { "driveGearId": 18, "timestamp": 1534264050, "temperature": 55 } ] }
حدد تشغيل. تعرض علامة التبويب Output تعليمة استجابة HTTP البرمجية والمحتوى. لمشاهدة رسائل السجل، افتح علامة التبويب Logs في القائمة المنبثقة للجزء (إذا لم تكن مفتوحة بالفعل). تعرض الصورة التالية مثالاً للاستجابة في جزء الإخراج والرسائل في الجزء Logs.
تظهر علامة التبويب Output أنه تمت إضافة حقل حالة بشكل صحيح إلى كل قراءة من القراءات.