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

Tamamlandı

Tahrik dişlisi örneğimizden devam edelim ve sıcaklık hizmeti için mantık ekleyelim. Ö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ında sıcaklıklar Tamam 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 işlev uygulamanızı dağıttınız ve açtınız. 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 altındaki İşlev Uygulaması ekranında Azure portalında oluştur'u seçin. İşlev oluştur bölmesi görüntülenir.

  3. Şablon seçin'in altında HTTP tetikleyicisi'ni seçin.

  1. Oluştur’u seçin. HttpTrigger1 oluşturulur ve HttpTrigger1 İşlev bölmesinde görüntülenir.

  2. Soldaki Geliştirici menüsünde Kod + Test'i seçin. kod düzenleyicisi açılır ve işlevinizin index.js kod dosyasının içeriği görüntülenir. 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. Http ile tetiklenen bu işlev başarıyla yürütüldü., istekte gönderilen adı geri döndürdü.

    Kaynak dosya açılan listesinden function.json dosyasını 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ündeki Yeni İşlev alanına DriveGearTemperatureService yazın. 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, $name hello iletisini döndürür ve istekte gönderilen adı geri döndürür.

  3. Kaynak açılan listesinden function.json dosyasını 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.

İşlevi test etme

Bahşiş

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. Günlük çerçevesi dakikada bir izleme bildirimleri tahakkuk etmeye 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. URL’nin sonundaki Panoya kopyala simgesini seçerek bu bağlantıyı kaydedin. Bu bağlantıyı daha sonra kullanmak üzere Not Defteri veya benzer bir uygulamada depolayın.

    Screenshot of the Azure portal showing the function editor, with the Get function URL button highlighted.

  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>"
    

    Bahşiş

    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 işleve özgü API anahtarı gerektiren İşlev olarak ayarlanır. 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 adlı x-functions-keybir HTTP üst bilgisi olarak geçirin.

  1. İşlevi ve ana anahtarları bulmak için İşlev Uygulaması menüsündeki Geliştirici'nin altında İşlev Anahtarları'nı seçin. İşlevinizin İşlev Tuşları bölmesi açılır.

  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 veya benzer bir uygulamada depolayın.

    Screenshot showing the Function Keys pane with the revealed function key highlighted.

  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. değerini <your-function-key> kaydettiğiniz işlev anahtarı değeriyle, değerini ise işlevinizin URL'si ile değiştirin <your-https-url> .

    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:

    • application/json türünde bir Content-Type üst bilgi değeri eklenir.
    • İşlev Anahtarı x-functions-key üst bilgi değeri olarak geçirilir.
    • 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)
```

İşleve iş mantığı ekleme

Ş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öndereceğimiz istek gövdesinin bir örneğidir. Her reading girdisinin bir kimliği, zaman damgası ve sıcaklık değeri vardır.

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

İş mantığımızı uygulamak için işlevimizdeki varsayılan kodu 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.

Bölmenin Log en altındaki Günlükler'i genişlettiğinize dikkat edin. İşlev çalıştırıldığında, bu deyimler Günlükler penceresine ileti ekler.

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 ileti ekler.

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

İşlevimizi test etmek için Geliştirici>Kodu + Test'teki Test/Çalıştır özelliğini kullanacağız.

  1. 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
            }
        ]
    }
    
  2. Ç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 alt açılır menüsündeki Günlükler sekmesini açın (henüz açık değilse). Aşağıdaki resimde, çıkış bölmesinde örnek yanıt ve Günlükler bölmesinde iletiler gösterilir.

    Screenshot of the Azure function editor, with the Test and Logs tabs showing.

    Çıkış sekmesi, bir durum alanının okumaların her birine doğru şekilde eklendiğini gösterir.

  3. İsteğin Uygulama Analizler'da günlüğe kaydedildiğini görmek için soldaki Geliştirici menüsünde İzleyici'yi seçin. İşleviniz için İzleyici bölmesi görüntülenir.

    Bölmenin Çağırmalar Sekmesi, işlev çağrılarınızın her biri için Çağırma İzlemeleri görüntüler. Çağrılardan biri için Date(UTC) değerini seçin ve işlevinizin yürütülmesiyle ilgili ayrıntıları görüntüleyin.