مشاركة عبر


التشغيل السريع: إنشاء واجهة برمجة تطبيقات ويب قابلة للتطوير باستخدام Azure Functions

في هذا البدء السريع، تستخدم أدوات سطر الأوامر من Azure Developer لبناء واجهة ويب قابلة للتوسع مع نقاط نهاية للوظائف تستجيب لطلبات HTTP. بعد اختبار التعليمات البرمجية محليا، يمكنك نشرها إلى تطبيق وظائف بلا خادم جديد تقوم بإنشائه قيد التشغيل في خطة Flex Consumption في Azure Functions.

يستخدم مصدر المشروع Azure Developer CLI (azd) لتبسيط نشر التعليمات البرمجية الخاصة بك إلى Azure. يتبع هذا النشر أفضل الممارسات الحالية لتوزيع وظائف Azure الآمنة والقابلة للتطوير.

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

Prerequisites

  • أداة اختبار HTTP آمنة لإرسال الطلبات مع حمولات JSON إلى نقاط نهاية الدالة. يستخدم هذا المقال curl.

تهيئة المشروع

استخدم الأمر azd init لإنشاء مشروع كود Azure Functions محلي من قالب.

  1. في الوحدة الطرفية المحلية أو موجه الأوامر، قم بتشغيل هذا azd init الأمر في مجلد فارغ:

    azd init --template functions-quickstart-dotnet-azd -e httpendpoint-dotnet
    

    يسحب هذا الأمر ملفات المشروع من مستودع القالب ويهيئ المشروع في المجلد الحالي. -e تعين العلامة اسما للبيئة الحالية. في azd، تحتفظ البيئة بسياق توزيع فريد لتطبيقك، ويمكنك تحديد أكثر من واحد. كما يتم استخدامه في اسم مجموعة الموارد التي تقوم بإنشائها في Azure.

  2. قم بتشغيل هذا الأمر للانتقال إلى http مجلد التطبيق:

    cd http
    
  3. قم بإنشاء ملف باسم local.settings.json في http المجلد الذي يحتوي على بيانات JSON هذه:

    {
        "IsEncrypted": false,
        "Values": {
            "AzureWebJobsStorage": "UseDevelopmentStorage=true",
            "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated"
        }
    }
    

    هذا الملف مطلوب عند التشغيل محليا.

  1. في الوحدة الطرفية المحلية أو موجه الأوامر، قم بتشغيل هذا azd init الأمر في مجلد فارغ:

    azd init --template azure-functions-java-flex-consumption-azd -e httpendpoint-java 
    

    يسحب هذا الأمر ملفات المشروع من مستودع القالب ويهيئ المشروع في المجلد الحالي. -e تعين العلامة اسما للبيئة الحالية. في azd، تحتفظ البيئة بسياق توزيع فريد لتطبيقك، ويمكنك تحديد أكثر من واحد. كما يتم استخدامه في اسم مجموعة الموارد التي تقوم بإنشائها في Azure.

  2. قم بتشغيل هذا الأمر للانتقال إلى http مجلد التطبيق:

    cd http
    
  3. قم بإنشاء ملف باسم local.settings.json في http المجلد الذي يحتوي على بيانات JSON هذه:

    {
        "IsEncrypted": false,
        "Values": {
            "AzureWebJobsStorage": "UseDevelopmentStorage=true",
            "FUNCTIONS_WORKER_RUNTIME": "java"
        }
    }
    

    هذا الملف مطلوب عند التشغيل محليا.

  1. في الوحدة الطرفية المحلية أو موجه الأوامر، قم بتشغيل هذا azd init الأمر في مجلد فارغ:

    azd init --template functions-quickstart-javascript-azd -e httpendpoint-js
    

    يسحب هذا الأمر ملفات المشروع من مستودع القالب ويهيئ المشروع في المجلد الجذر. -e تعين العلامة اسما للبيئة الحالية. في azd، تحتفظ البيئة بسياق توزيع فريد لتطبيقك، ويمكنك تحديد أكثر من واحد. كما يتم استخدامه في اسم مجموعة الموارد التي تقوم بإنشائها في Azure.

  2. قم بإنشاء ملف باسم local.settings.json في المجلد الجذر الذي يحتوي على بيانات JSON هذه:

    {
        "IsEncrypted": false,
        "Values": {
            "AzureWebJobsStorage": "UseDevelopmentStorage=true",
            "FUNCTIONS_WORKER_RUNTIME": "node"
        }
    }
    

    هذا الملف مطلوب عند التشغيل محليا.

  1. في الوحدة الطرفية المحلية أو موجه الأوامر، قم بتشغيل هذا azd init الأمر في مجلد فارغ:

    azd init --template functions-quickstart-powershell-azd -e httpendpoint-ps
    

    يسحب هذا الأمر ملفات المشروع من مستودع القالب ويهيئ المشروع في المجلد الجذر. -e تعين العلامة اسما للبيئة الحالية. في azd، تحتفظ البيئة بسياق توزيع فريد لتطبيقك، ويمكنك تحديد أكثر من واحد. كما يتم استخدامه في اسم مجموعة الموارد التي تقوم بإنشائها في Azure.

  2. قم بتشغيل هذا الأمر للانتقال إلى src مجلد التطبيق:

    cd src
    
  3. قم بإنشاء ملف باسم local.settings.json في src المجلد الذي يحتوي على بيانات JSON هذه:

    {
        "IsEncrypted": false,
        "Values": {
            "AzureWebJobsStorage": "UseDevelopmentStorage=true",
            "FUNCTIONS_WORKER_RUNTIME": "powershell",
            "FUNCTIONS_WORKER_RUNTIME_VERSION": "7.2"
        }
    }
    

    هذا الملف مطلوب عند التشغيل محليا.

  1. في الوحدة الطرفية المحلية أو موجه الأوامر، قم بتشغيل هذا azd init الأمر في مجلد فارغ:

    azd init --template functions-quickstart-typescript-azd -e httpendpoint-ts
    

    يسحب هذا الأمر ملفات المشروع من مستودع القالب ويهيئ المشروع في المجلد الجذر. -e تعين العلامة اسما للبيئة الحالية. في azd، تحتفظ البيئة بسياق توزيع فريد لتطبيقك، ويمكنك تحديد أكثر من واحد. يستخدم اسم البيئة أيضا في اسم مجموعة الموارد التي تنشئها في Azure.

  2. قم بإنشاء ملف باسم local.settings.json في المجلد الجذر الذي يحتوي على بيانات JSON هذه:

    {
        "IsEncrypted": false,
        "Values": {
            "AzureWebJobsStorage": "UseDevelopmentStorage=true",
            "FUNCTIONS_WORKER_RUNTIME": "node"
        }
    }
    

    هذا الملف مطلوب عند التشغيل محليا.

  1. في الوحدة الطرفية المحلية أو موجه الأوامر، قم بتشغيل هذا azd init الأمر في مجلد فارغ:

    azd init --template functions-quickstart-python-http-azd -e httpendpoint-py
    

    يسحب هذا الأمر ملفات المشروع من مستودع القالب ويهيئ المشروع في المجلد الجذر. -e تعين العلامة اسما للبيئة الحالية. في azd، تحتفظ البيئة بسياق توزيع فريد لتطبيقك، ويمكنك تحديد أكثر من واحد. يستخدم اسم البيئة أيضا في اسم مجموعة الموارد التي تنشئها في Azure.

  2. قم بإنشاء ملف باسم local.settings.json في المجلد الجذر الذي يحتوي على بيانات JSON هذه:

    {
        "IsEncrypted": false,
        "Values": {
            "AzureWebJobsStorage": "UseDevelopmentStorage=true",
            "FUNCTIONS_WORKER_RUNTIME": "python"
        }
    }
    

    هذا الملف مطلوب عند التشغيل محليا.

إنشاء وتنشيط البيئة الظاهرية

في المجلد الجذر، قم بتشغيل هذه الأوامر لإنشاء وتنشيط بيئة ظاهرية باسم .venv:

python3 -m venv .venv
source .venv/bin/activate

إذا لم تقم بايثون بتثبيت حزمة venv على توزيعة لينكس الخاصة بك، شغل الأمر التالي:

sudo apt-get install python3-venv

تشغيل في بيئتك المحلية

  1. قم بتشغيل هذا الأمر من مجلد التطبيق في محطة طرفية أو موجه أوامر:

    func start
    
    mvn clean package
    mvn azure-functions:run
    
    npm install
    func start  
    
    npm install
    npm start  
    

    عندما يبدأ مضيف الوظائف في مجلد المشروع المحلي، فإنه يكتب نقاط نهاية عنوان URL للوظائف التي تم تشغيلها من قبل HTTP إلى إخراج المحطة الطرفية.

    Note

    نظرا لأن تفويض مفتاح الوصول غير مطبق عند التشغيل محليا، فإن رابط الوظيفة المرتجع لا يتضمن قيمة مفتاح الوصول ولا تحتاجه لاستدعاء وظيفتك.

  2. في متصفحك، اذهب إلى httpget نقطة النهاية، والتي يجب أن تبدو كهذا العنوان:

    http://localhost:7071/api/httpget

  3. من محطة طرفية جديدة أو نافذة موجه الأوامر، قم بتشغيل هذا curl الأمر لإرسال طلب POST مع حمولة JSON إلى httppost نقطة النهاية:

    curl -i http://localhost:7071/api/httppost -H "Content-Type: text/json" -d @testdata.json
    
    curl -i http://localhost:7071/api/httppost -H "Content-Type: text/json" -d "@src/functions/testdata.json"
    

    يقرأ هذا الأمر بيانات حمولة JSON من testdata.json ملف المشروع. يمكنك العثور على أمثلة لكلا طلبي HTTP في test.http ملف المشروع.

  4. عند الانتهاء، اضغط على Ctrl+C في نافذة المحطة الطرفية لإيقاف func.exe عملية المضيف.

  1. قم بتشغيل deactivate لإيقاف تشغيل البيئة الظاهرية.

راجع الكود (اختياري)

يمكنك مراجعة التعليمات البرمجية التي تحدد نقطتي نهاية دالة مشغل HTTP:

       [Function("httpget")]
       public IActionResult Run([HttpTrigger(AuthorizationLevel.Function, "get")]
         HttpRequest req,
         string name)
       {
           var returnValue = string.IsNullOrEmpty(name)
               ? "Hello, World."
               : $"Hello, {name}.";

           _logger.LogInformation($"C# HTTP trigger function processed a request for {returnValue}.");

           return new OkObjectResult(returnValue);
       }
@FunctionName("httpget")
public HttpResponseMessage run(
        @HttpTrigger(
            name = "req",
            methods = {HttpMethod.GET},
            authLevel = AuthorizationLevel.FUNCTION)
            HttpRequestMessage<Optional<String>> request,
        final ExecutionContext context) {
    context.getLogger().info("Java HTTP trigger processed a request.");

    // Parse query parameter
    String name = Optional.ofNullable(request.getQueryParameters().get("name")).orElse("World");

    return request.createResponseBuilder(HttpStatus.OK).body("Hello, " + name).build();
}
const { app } = require('@azure/functions');

app.http('httpget', {
    methods: ['GET'],
    authLevel: 'function',
    handler: async (request, context) => {
        context.log(`Http function processed request for url "${request.url}"`);

        const name = request.query.get('name') || await request.text() || 'world';

        return { body: `Hello, ${name}!` };
    }
});
import { app, HttpRequest, HttpResponseInit, InvocationContext } from "@azure/functions";

export async function httpGetFunction(request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> {
    context.log(`Http function processed request for url "${request.url}"`);

    const name = request.query.get('name') || await request.text() || 'world';

    return { body: `Hello, ${name}!` };
};

app.http('httpget', {
    methods: ['GET'],
    authLevel: 'function',
    handler: httpGetFunction
});

يعرف هذا function.json الملف الدالة httpget :

{
  "bindings": [
    {
      "authLevel": "function",
      "type": "httpTrigger",
      "direction": "in",
      "name": "Request",
      "methods": [
        "get"
      ],
      "route": "httpget"
    },
    {
      "type": "http",
      "direction": "out",
      "name": "Response"
    }
  ]
}

ينفذ هذا 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
$name = $Request.Query.name

$body = "This HTTP triggered function executed successfully. Pass a name in the query string 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
})
@app.route(route="httpget", methods=["GET"])
def http_get(req: func.HttpRequest) -> func.HttpResponse:
    name = req.params.get("name", "World")

    logging.info(f"Processing GET request. Name: {name}")

    return func.HttpResponse(f"Hello, {name}!")

يمكنك مراجعة مشروع القالب الكامل هنا.

يمكنك مراجعة مشروع القالب الكامل هنا.

يمكنك مراجعة مشروع القالب الكامل هنا.

يمكنك مراجعة مشروع القالب الكامل هنا.

يمكنك مراجعة مشروع القالب الكامل هنا.

يمكنك مراجعة مشروع القالب الكامل هنا.

بعد التحقق من وظائفك محليا، حان الوقت لنشرها على Azure.

نشر في Azure

تم تكوين هذا المشروع لاستخدام azd up الأمر لنشر هذا المشروع إلى تطبيق وظائف جديد في خطة استهلاك Flex في Azure.

Tip

يتضمن المشروع مجموعة من ملفات Bicep (في المجلد infra ) تستخدم azd لإنشاء نشر آمن ضمن خطة استهلاك مرنة تتبع أفضل الممارسات.

  1. قم بتشغيل هذا الأمر لإنشاء azd موارد Azure المطلوبة في Azure ونشر مشروع التعليمات البرمجية إلى تطبيق الوظائف الجديد:

    azd up
    

    يحتوي المجلد الجذر على azure.yaml ملف التعريف المطلوب من قبل azd.

    إذا لم تكن مسجلا الدخول بالفعل، يطلب منك المصادقة باستخدام حساب Azure الخاص بك.

  2. عند المطالبة، قم بتوفير معلمات النشر المطلوبة هذه:

    Parameter Description
    اشتراك Azure الاشتراك الذي يتم فيه إنشاء مواردك.
    موقع Azure منطقة Azure التي يتم فيها إنشاء مجموعة الموارد التي تحتوي على موارد Azure الجديدة. يتم عرض المناطق التي تدعم حاليا خطة استهلاك Flex فقط.
    vnetEnabled اختر الزائف. عند ضبطه على True ، ينشئ النشر تطبيق الوظائف الخاص بك في شبكة افتراضية جديدة.

    azd up يستخدم الأمر ردودك على هذه التعليمات باستخدام ملفات تكوين Bicep لإكمال مهام النشر هذه:

    • إنشاء وتكوين موارد Azure المطلوبة هذه (ما يعادل azd provision):

      • خطة استهلاك Flex وتطبيق الوظائف
      • Azure Storage (مطلوب) وApplication Insights (مستحسن)
      • نهج الوصول والأدوار لحسابك
      • اتصالات الخدمة إلى الخدمة باستخدام الهويات المدارة (بدلا من سلسلة الاتصال المخزنة)
      • (خيار) شبكة افتراضية لتشغيل كل من تطبيق الوظائف وموارد Azure الأخرى بأمان
    • قم بحزم التعليمات البرمجية ونشرها في حاوية التوزيع (ما يعادل azd deploy). ثم يتم بدء تشغيل التطبيق وتشغيله في الحزمة المنشورة.

    بعد اكتمال الأمر بنجاح، سترى ارتباطات إلى الموارد التي قمت بإنشائها.

استدعاء الدالة في Azure

يمكنك الآن استدعاء نقاط نهاية الوظائف في Azure عن طريق إجراء طلبات HTTP إلى روابطها باستخدام أداة اختبار HTTP أو من المتصفح (لطلبات GET). عند تشغيل وظائفك في Azure، يتم فرض تخويل مفتاح الوصول، ويجب توفير مفتاح وصول دالة مع طلبك.

يمكنك استخدام الأدوات الأساسية لتشغيل نقاط نهاية URL لوظائفك في Azure.

  1. في الوحدة الطرفية المحلية أو موجه الأوامر، قم بتشغيل هذه الأوامر للحصول على قيم نقطة نهاية URL:

    SET APP_NAME=$(azd env get-value AZURE_FUNCTION_NAME)
    func azure functionapp list-functions $APP_NAME --show-keys
    
    $APP_NAME = azd env get-value AZURE_FUNCTION_NAME
    func azure functionapp list-functions $APP_NAME --show-keys
    

    azd env get-value يحصل الأمر على اسم تطبيق الوظائف من البيئة المحلية. عند استخدام --show-keys الخيار مع func azure functionapp list-functions، فإن قيمة Invoke URL: العائد لكل نقطة نهاية تتضمن مفتاح وصول على مستوى الوظيفة.

  2. كما كان من قبل، استخدم أداة اختبار HTTP للتحقق من صحة عناوين URL هذه في تطبيق الوظائف الذي يعمل في Azure.

إعادة نشر التعليمات البرمجية الخاصة بك

شغل azd up الأمر عدة مرات تحتاج لتوفير موارد Azure ونشر تحديثات الكود إلى تطبيق الوظائف الخاص بك.

Note

تتم دائما الكتابة فوق ملفات التعليمات البرمجية المنشورة بواسطة أحدث حزمة نشر.

يتم تخزين استجاباتك الأولية للمطالبات azd وأي متغيرات بيئة تم إنشاؤها بواسطة azd محليا في البيئة المسماة. استخدم الأمر azd env get-values لمراجعة جميع المتغيرات في بيئتك التي استخدمتها عند إنشاء موارد Azure.

تنظيف الموارد

عندما تنتهي من العمل مع تطبيق الوظائف والموارد ذات الصلة، استخدم هذا الأمر لحذف تطبيق الوظائف وموارده ذات الصلة من Azure وتجنب تحمل أي تكاليف إضافية:

azd down --no-prompt

Note

يرشد --no-promptazd الخيار إلى حذف مجموعة الموارد الخاصة بك دون تأكيد منك.

لا يؤثر هذا الأمر على مشروع التعليمات البرمجية المحلية.