Alıştırma - İşlev uygulamasına mantık ekleme

Tamamlandı

Dişli tahrik örneğimizden devam edelim ve sıcaklık hizmeti için mantık ekleme yapalım. Özel olarak, bir HTTP isteğinden veriler alacağız.

İşlev gereksinimleri

İlk olarak, mantığımız için bazı gereksinimler tanımlamalıyız:

  • 0 ile 25 derece arasındaki sıcaklıklar OK olarak işaretlenmelidir.
  • 25 ile 50 derecenin üzerindeki sıcaklıklar DİkKAT olarak işaretlenmelidir.
  • 50 derecenin üzerindeki sıcaklıklar TEHLİKE olarak işaretlenmeli.

İşlev uygulamanıza işlev ekleme

Önceki ünitede açıklandığı gibi Azure, işlevleri oluşturmanıza yardımcı olacak şablonlar sağlar. Bu ünitede HttpTrigger , sıcaklık hizmetini uygulamak için şablonu kullanacaksınız.

  1. Önceki alıştırmada fonksiyon uygulamanızı dağıttınız ve açtınız. Eğer henüz açık değilse, Giriş sayfasından Tüm kaynaklar'ı ve ardından escalator-functions-xxx gibi bir adla adlandırılan işlev uygulamanızı seçerek açabilirsiniz.

  2. İşlevler sekmesinin ve Azure portalında oluştur'un altındaki İşlev Uygulaması ekranında İşlev Oluştur'u seçin. İşlev oluştur bölmesi görüntülenir.

  3. Şablon seçin'in altında HTTP tetikleyicisi seçin ve İleri seçin.

  1. İşlev adını HttpTrigger1 ve Yetkilendirme Düzeyi'ni İşlev olarak bırakın ve Oluştur'u seçin. HttpTrigger1 işlevi oluşturulur ve HttpTrigger1 İşlev bölmesinde görüntülenir.

  2. Kod + Test sekmesini seçin. kod düzenleyicisi açılır ve işlevinizin index.js kod dosyasının içeriğini görüntüler. HTTP şablonunun oluşturduğu varsayılan kod aşağıdaki kod parçacığında görünür.

    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
        };
    }
    

    İşleviniz HTTP isteği sorgu dizesi aracılığıyla veya istek gövdesinin bir parçası olarak bir ad geçirilmesini bekler. İşlev, Hello, name iletisini döndürerek yanıt verir. Bu HTTP ile tetiklenen işlev başarıyla yürütüldü ve istekte gönderilen adı tekrar iletti.

    Kaynak dosya açılan listesinden function.json'ı seçerek işlevin yapılandırmasını görüntüleyin. Bu, aşağıdaki koda benzer olmalıdır.

    {
      "bindings": [
        {
          "authLevel": "function",
          "type": "httpTrigger",
          "direction": "in",
          "name": "req",
          "methods": [
            "get",
            "post"
          ]
        },
        {
          "type": "http",
          "direction": "out",
          "name": "res"
        }
      ]
    }
    

    Bu yapılandırma dosyası, işlevin bir HTTP isteği aldığında çalıştığını bildirir. Çıkış bağlaması yanıtın bir HTTP yanıtı olarak gönderildiğini bildirir.

  1. Şablon ayrıntıları bölümünde, İşlev Adı alanına DriveGearTemperatureService girin. Yetkilendirme düzeyini İşlev olarak bırakın ve ardından oluştur'u seçerek işlevi oluşturun. DriveGearTemperatureService İşlevinizin Genel Bakış bölmesi görüntülenir.

  2. İşlev menüsünde Kod + Test'i seçin. Kod düzenleyicisi run.ps1 kod dosyasının içeriğiyle açılır. Şablonun bizim için oluşturduğu varsayılan kod, aşağıdaki kod parçacığında listelenir.

    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
    })
    

    İşlevimiz, HTTP isteği sorgu dizesi aracılığıyla veya istek gövdesinin bir parçası olarak bir ad geçirilmesini bekler. HTTP işlevlerinin çıkış bağlamalarına yazarak bir yanıt oluşturması gerekir; bu, PowerShell İşlevlerinde Push-OutputBinding cmdlet'iyle gerçekleştirilir. Bu işlev, istekte gönderilen adı geri döndüren Merhaba, $name biçimindeki iletiyi döndürür.

  3. Kaynak açılır listesinden function.json'ı seçerek işlevin yapılandırmasını görüntüleyin. Bu, aşağıdaki gibi görünmelidir.

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

    Bu yapılandırma, işlevin HTTP isteğini aldığında çalıştırıldığını bildirir. Çıkış bağlaması yanıtın bir HTTP yanıtı olarak gönderildiğini bildirir.

Fonksiyonu test et

İpucu

cURL, dosyaları göndermek veya almak için kullanılabilen bir komut satırı aracıdır. Linux, macOS ve Windows 10'a eklenmiştir ve diğer işletim sistemlerinin çoğu için indirilebilir. cURL tarafından desteklenen çok sayıda protokol arasında HTTP, HTTPS, FTP, FTPS, SFTP, LDAP, TELNET, SMTP, POP3 vb. bulunur. Daha fazla bilgi için aşağıdaki bağlantılara bakın:

İşlevi test etmek için, komut satırında cURL'yi kullanarak işlev URL'sine bir HTTP isteği gönderebilirsiniz.

  1. Tetikleyici işlevi bölmesinin en altındaki Günlükler çerçevesini genişletin. Günlükler çerçevesinin üst kısmındaki açılan listeden Dosya Sistemi Günlükleri'ni seçin. Kayıt çerçevesi her dakika iz bildirimleri biriktirmeye başlamalıdır.

  2. İşlevin uç nokta URL'sini bulmak için aşağıdaki görüntüde gösterildiği gibi komut çubuğunda İşlev URL'sini al'ı seçin. _master (Konak anahtarı) bağlantısını, URL'nin sonundaki Panoya kopyala simgesini seçerek kaydedin. Bu bağlantıyı daha sonra kullanmak üzere Not Defteri'nde veya benzer bir uygulamada depolayın.

    İşlev URL’sini al düğmesinin vurgulandığı işlev düzenleyicisini gösteren Azure portal ekran görüntüsü.

  3. Bir komut istemi açın ve cURL'yi çalıştırarak işlev URL'sine bir HTTP isteği gönderin. Önceki adımda kopyaladığınız URL'yi kullanmayı unutmayın.

    curl "<your-https-url>"
    

    İpucu

    URL'deki özel karakterlerle ilgili sorunları önlemek için URL'yi tırnak içine almanız gerekebilir.
    Windows kullanıyorsanız komut isteminden komutunu çalıştırın cURL . PowerShell'in bir curl komutu vardır, ancak Invoke-WebRequest için bir diğer addır ve ile cURLaynı değildir.

    Yanıt aşağıdaki gibi görünmelidir.

    This HTTP triggered function executed successfully. Pass a name on the query string or in the request body for a personalized response.
    

    Şimdi istekte bir ad geçirin. Bunu yapmak için URL'ye adlı name bir sorgu dizesi parametresi eklemeniz gerekir. Aşağıdaki örnek sorgu dizesi parametresini name=Azureekler.

    curl "<your-https-url>&name=Azure"
    

    Yanıt aşağıdaki gibi görünmelidir.

    Hello, Azure. This HTTP triggered function executed successfully.
    

    İşlev başarıyla yürütüldü ve istekte iletmiş olduğunuz adı döndürdü.

HTTP tetikleyicilerinin güvenliğini sağlama

HTTP tetikleyicileri, isteğin bir parçası olarak anahtar gerektirerek bilinmeyen arayanları engellemek için API anahtarlarını kullanmanıza olanak tanır. İşlev oluştururken yetkilendirme düzeyini seçersiniz. Varsayılan olarak düzey İşlev olarak ayarlanır ve işleve özgü API anahtarı gerekir. Genel bir "ana" anahtar kullanmak için Yönetici olarak veya anahtar gerek olmadığını belirtmek için Anonim olarak da ayarlanabilir. Yetkilendirme düzeyini, işlev oluşturulduktan sonra işlev özellikleri aracılığıyla da değiştirebilirsiniz.

Bu işlevi oluştururken İşlev'i belirttiğinizden, HTTP isteğini gönderirken anahtarı sağlamanız gerekir. Bunu adlı codebir sorgu dizesi parametresi olarak gönderebilirsiniz. Alternatif olarak, tercih edilen yöntemi kullanın ve x-functions-key adlı bir HTTP üst bilgisi olarak geçirin.

  1. İşlev tuşlarını bulmak için, Genel Bakış menüsündeki İşlevler sekmesinin altında işlevinizin adını (örneğin, HttpTriger1) seçerek Kod + Test menüsünü açın. Ardından İşlev Tuşları sekmesini seçin.

  2. Varsayılan olarak işlev anahtarı değeri gizlenir. Değeri göster'i seçerek varsayılan işlev anahtarı değerini gösterin. Değer alanının içeriğini panoya kopyalayın ve bu anahtarı daha sonra kullanmak üzere Not Defteri'nde veya benzer bir uygulamada depolayın.

    Gösterilen işlev tuşunun vurgulandığı İşlev Tuşları bölmesini gösteren ekran görüntüsü.

  3. İşlevi işlev anahtarıyla test etmek için bir komut istemi açın ve cURL'yi çalıştırarak işlev URL'sine bir HTTP isteği gönderin. <your-function-key> kaydettiğiniz işlev anahtarı değeri ile değiştirin ve <your-https-url> işlevinizin URL'si ile değiştirin.

    curl --header "Content-Type: application/json" --header "x-functions-key: <your-function-key>" --request POST --data "{\"name\": \"Azure Function\"}" <your-https-url>
    
  4. cURL komutunu gözden geçirin ve aşağıdaki değerlere sahip olduğunu doğrulayın:

    • Content-Type türünde bir application/json başlık değeri eklendi.
    • İşlev Anahtarı x-functions-key üst bilgi değeri olarak geçirildi.
    • POST isteği kullanılır.
    • İşlevinizin URL'sini içeren Azure İşlevi'ne geçildi.
  5. Günlükleri denetleyin.

    Kod + Test bölmesi, günlük dosyası çıkışını görüntüleyen bir oturum açmalıdır (Günlükler bölmesinin en üstündeki açılan listede Dosya Sistemi Günlükleri'ninseçili olduğundan emin olun). Günlük dosyası isteğinizin durumuyla güncelleştirilir ve bu durum şuna benzer olmalıdır:

```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)
```

Fonksiyona iş mantığı ekleyin

Şimdi işlevine mantık ekleyerek aldığı sıcaklık okumalarını denetleyelim ve her sıcaklık okuması için bir durum ayarlayalım.

İşlevimiz bir dizi sıcaklık okuması bekliyor. Aşağıdaki JSON kod parçacığı, işlevimize gönderdiğimiz istek gövdesine bir örnektir. JavaScript veya PowerShell için dizinin adı biraz farklı olabilir, ancak dizideki her girişin kimliği, zaman damgası ve sıcaklığı vardır.

{
    "Readings": [
        {
            "driveGearId": 1,
            "timestamp": 1534263995,
            "temperature": 23
        },
        {
            "driveGearId": 3,
            "timestamp": 1534264048,
            "temperature": 45
        },
        {
            "driveGearId": 18,
            "timestamp": 1534264050,
            "temperature": 55
        }
    ]
}

İşlevimizdeki varsayılan kodu iş mantığımızı uygulayan aşağıdaki kodla değiştirelim.

HttpTrigger1 işlev bölmesinde index.js dosyasını açın ve aşağıdaki kodla değiştirin. Bu değişikliği yaptıktan sonra, dosyaya güncelleştirmeleri kaydetmek için komut çubuğunda Kaydet'i seçin.

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();
};

Eklenen mantık oldukça basittir. Diziyi yineler ve sıcaklık alanının değerine göre durumu Tamam, DİkKAT veya TEHLİkE olarak ayarlarız. Ardından okuma dizisini her girdiye durum alanı ekleyerek geri göndeririz.

Log'i, bölmenin en altındaki ifadelerini genişlettiğinizde fark edin. İşlev çalıştırıldığında, bu deyimler Günlükler penceresine mesaj ekler.

İş mantığımızı test etme

Test/Run ve Geliştirici>Code + Test özelliklerini kullanarak işlevimizi test edeceğiz.

  1. Kod + Test sekmesinde Test/Çalıştır'ı seçin. Giriş sekmesinde Gövde metin kutusunun içeriğini aşağıdaki kodla değiştirerek örnek isteğimizi oluşturun.

    {
        "readings": [
            {
                "driveGearId": 1,
                "timestamp": 1534263995,
                "temperature": 23
            },
            {
                "driveGearId": 3,
                "timestamp": 1534264048,
                "temperature": 45
            },
            {
                "driveGearId": 18,
                "timestamp": 1534264050,
                "temperature": 55
            }
        ]
    }
    

run.ps1 dosyasını açın ve içeriğini aşağıdaki kodla değiştirin. Bu değişikliği yaptıktan sonra, dosyaya güncelleştirmeleri kaydetmek için komut çubuğunda Kaydet'i seçin.

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
})

Eklenen mantık oldukça basittir. Diziyi yineler ve sıcaklık alanının değerine göre durumu Tamam, DİkKAT veya TEHLİkE olarak ayarlarız. Ardından okuma dizisini her girdiye durum alanı ekleyerek geri göndeririz.

Write-Host cmdlet'ine yapılan çağrıları not alın. İşlev çalıştırıldığında, bu deyimler Günlükler penceresine mesaj ekler.

İş mantığını test edin

Test/Run ve Geliştirici>Code + Test özelliklerini kullanarak işlevimizi test edeceğiz.

  1. Kod + Test sekmesinde Test/Çalıştır'ı seçin. Giriş sekmesinde Gövde metin kutusunun içeriğini aşağıdaki kodla değiştirerek örnek isteğimizi oluşturun.

    {
        "Readings": [
            {
                "driveGearId": 1,
                "timestamp": 1534263995,
                "temperature": 23
            },
            {
                "driveGearId": 3,
                "timestamp": 1534264048,
                "temperature": 45
            },
            {
                "driveGearId": 18,
                "timestamp": 1534264050,
                "temperature": 55
            }
        ]
    }
    
  1. Çalıştır seçin. Çıkış sekmesinde HTTP yanıt kodu ve içeriği görüntülenir. Günlük iletilerini görmek için bölmenin açılır öğesinde (henüz açık değilse) Günlükler sekmesini açın. Aşağıdaki resimde, çıkış bölmesinde örnek yanıt ve Günlükler bölmesinde iletiler gösterilir.

    Test ve Günlükler sekmelerinin gösterildiği Azure işlev düzenleyicisinin ekran görüntüsü.

    Çıkış sekmesi, her bir okumaya doğru bir durum alanı eklendiğini gösterir.