Latihan - Menambahkan logika ke aplikasi fungsi

Selesai

Mari kita lanjutkan dengan contoh penggerak roda gigi kami, dan tambahkan logika untuk layanan suhu. Secara khusus, kami akan menerima data dari permintaan HTTP.

Persyaratan fungsi

Pertama, kita perlu menentukan beberapa persyaratan untuk logika kita:

  • Suhu dari 0 hingga 25 derajat harus ditandai sebagai OK.
  • Suhu di atas 25 hingga 50 derajat harus ditandai sebagai WASPADA.
  • Suhu di atas 50 derajat harus ditandai sebagai BAHAYA.

Menambahkan fungsi ke aplikasi fungsi Anda

Seperti yang kami jelaskan di unit sebelumnya, Azure menyediakan templat yang membantu Anda membuat fungsi. Dalam unit ini, Anda menggunakan HttpTrigger templat untuk mengimplementasikan layanan suhu.

  1. Dalam latihan sebelumnya, Anda menyebarkan aplikasi fungsi dan membukanya. Jika belum terbuka, Anda dapat membukanya dari halaman Beranda dengan memilih Semua sumber daya, lalu memilih aplikasi fungsi Anda, bernama sesuatu seperti escalator-functions-xxx.

  2. Pada layar Aplikasi Fungsi di bawah tab Fungsi dan Buat di portal Microsoft Azure, pilih Buat Fungsi. Panel Buat fungsi muncul.

  3. Di bawah Pilih templat, pilih pemicu HTTP dan pilih Berikutnya.

  1. Biarkan Nama fungsi sebagai HttpTrigger1 dan Tingkat Otorisasi sebagai Fungsi, dan pilih Buat. Fungsi HttpTrigger1 dibuat dan ditampilkan di panel Fungsi HttpTrigger1 .

  2. Pilih tab Kode + Uji . Editor kode terbuka, menampilkan konten file kode index.js untuk fungsi Anda. Kode default yang dibuat oleh templat HTTP muncul di cuplikan berikut.

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

    Fungsi Anda mengharapkan nama diteruskan baik melalui untai (karakter) kueri permintaan HTTP, atau sebagai bagian dari isi permintaan. Fungsi merespons dengan mengembalikan pesan Halo, <nama>. Fungsi yang dipicu HTTP ini berhasil dijalankan., menggemakan kembali nama yang dikirim dalam permintaan.

    Dari daftar dropdown file sumber, pilih function.json untuk melihat konfigurasi fungsi, yang akan terlihat seperti kode berikut.

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

    File konfigurasi ini menyatakan bahwa fungsi berjalan saat menerima permintaan HTTP. Pengikatan output menyatakan bahwa respons dikirim sebagai respons HTTP.

  1. Di bagian Detail templat , di bidang Nama Fungsi , masukkan DriveGearTemperatureService. Biarkan tingkat Otorisasi sebagai Fungsi, lalu pilih Buat untuk membuat fungsi. Panel Gambaran Umum untuk Fungsi DriveGearTemperatureService Anda muncul.

  2. Di menu Fungsi, pilih Kode + Uji. Editor kode terbuka dengan konten file kode run.ps1 . Kode default yang dihasilkan template untuk kami tercantum dalam cuplikan berikut.

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

    Fungsi kami mengharapkan nama diteruskan baik melalui string kueri permintaan HTTP, atau sebagai bagian dari badan permintaan. Fungsi HTTP harus menghasilkan respons dengan menulis ke pengikatan output mereka, yang dicapai dalam Fungsi PowerShell dengan Push-OutputBinding cmdlet. Fungsi ini mengembalikan pesan Hello, $name, menggemakan kembali nama yang dikirim dalam permintaan.

  3. Dari daftar dropdown sumber, pilih function.json untuk melihat konfigurasi fungsi, yang akan terlihat seperti berikut ini.

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

    Konfigurasi ini menyatakan bahwa fungsi berjalan ketika menerima permintaan HTTP. Pengikatan output menyatakan bahwa respons dikirim sebagai respons HTTP.

Uji fungsi

Petunjuk / Saran

cURL adalah alat baris perintah yang dapat digunakan untuk mengirim atau menerima file. Ini disertakan dengan Linux, macOS, dan Windows 10, dan dapat diunduh untuk sebagian besar sistem operasi lainnya. cURL mendukung berbagai protokol seperti HTTP, HTTPS, FTP, FTPS, SFTP, LDAP, TELNET, SMTP, POP3, dan sebagainya. Untuk mengetahui informasi lebih lanjut, lihat tautan berikut:

Untuk menguji fungsi, Anda dapat mengirim permintaan HTTP ke URL fungsi menggunakan cURL pada baris perintah.

  1. Perluas bingkai Log di bagian bawah panel fungsi pemicu. Pilih Filesystem Logs di menu drop-down di bagian atas jendela Log. Bingkai log harus mulai mengumpulkan pemberitahuan jejak setiap menit.

  2. Untuk menemukan URL titik akhir fungsi, dari bilah perintah, pilih Dapatkan URL fungsi, seperti yang ditunjukkan pada gambar berikut. Simpan tautan _master (Kunci host) dengan memilih ikon Salin ke clipboard di akhir URL. Simpan tautan ini ke Notepad atau aplikasi serupa untuk digunakan nanti.

    Cuplikan layar portal Microsoft Azure memperlihatkan editor fungsi, dengan tombol Dapatkan URL fungsi disorot.

  3. Buka perintah dan jalankan cURL untuk mengirim permintaan HTTP ke URL fungsi. Perlu diingat untuk menggunakan URL yang Anda salin di langkah sebelumnya.

    curl "<your-https-url>"
    

    Petunjuk / Saran

    Anda mungkin perlu membungkus URL dalam tanda kutip untuk menghindari masalah dengan karakter khusus di URL.
    Jika Anda menggunakan Windows, jalankan cURL dari prompt perintah. PowerShell memiliki perintah curl, tetapi ini merupakan alias untuk Invoke-WebRequest, yang tidak sama dengan cURL.

    Responsnya akan terlihat seperti berikut ini.

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

    Sekarang berikan nama dalam permintaan. Untuk melakukannya, Anda perlu menambahkan parameter string kueri bernama name ke URL. Contoh berikut menambahkan parameter name=Azurestring kueri .

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

    Responsnya akan terlihat seperti berikut ini.

    Hello, Azure. This HTTP triggered function executed successfully.
    

    Fungsi berhasil dijalankan dan mengembalikan nama yang Anda lewati dalam permintaan.

Mengamankan pemicu HTTP

Pemicu HTTP memungkinkan Anda menggunakan kunci API untuk memblokir penelepon yang tidak dikenal dengan meminta kunci sebagai bagian dari permintaan. Saat membuat fungsi, Anda memilih tingkat otorisasi. Secara default, tingkat diatur ke Fungsi, yang memerlukan kunci API khusus fungsi. Ini juga dapat diatur ke Admin untuk menggunakan kunci "master" global, atau Anonim untuk menunjukkan bahwa tidak ada kunci yang diperlukan. Anda juga dapat mengubah tingkat otorisasi melalui properti fungsi setelah pembuatan.

Karena Anda menentukan Fungsi saat membuat fungsi ini, Anda perlu menyediakan kunci saat mengirim permintaan HTTP. Anda dapat mengirimkannya sebagai parameter string kueri bernama code. Atau, gunakan metode pilihan dan teruskan sebagai header HTTP bernama x-functions-key.

  1. Untuk menemukan kunci fungsi, buka menu Kode + Uji dengan memilih nama fungsi Anda (misalnya, HttpTriger1) di bawah tab Fungsi pada menu Gambaran Umum . Kemudian, pilih tab Tombol Fungsi .

  2. Secara default, nilai kunci fungsi disembunyikan. Perlihatkan nilai kunci fungsi default dengan memilih Tampilkan nilai. Salin konten bidang Nilai ke clipboard, lalu simpan kunci ini di Notepad atau aplikasi serupa untuk digunakan nanti.

    Cuplikan layar memperlihatkan panel Tombol Fungsi dengan kunci fungsi yang terungkap disorot.

  3. Untuk menguji fungsi dengan kunci fungsi, buka prompt perintah dan jalankan cURL untuk mengirim permintaan HTTP ke URL fungsi. Ganti <your-function-key> dengan nilai kunci fungsi yang Anda simpan, dan ganti <your-https-url> dengan URL fungsi Anda.

    curl --header "Content-Type: application/json" --header "x-functions-key: <your-function-key>" --request POST --data "{\"name\": \"Azure Function\"}" <your-https-url>
    
  4. Tinjau perintah cURL dan verifikasi bahwa perintah memiliki nilai berikut:

    • Menambahkan Content-Typenilai header application/json tipe.
    • Melewati Tombol Fungsi sebagai nilai header x-functions-key.
    • Menggunakan POST permintaan.
    • Lulus Fungsi Azure dengan URL untuk fungsi Anda.
  5. Periksa log.

    Panel Kode + Uji harus membuka sesi yang menampilkan output file log (pastikan Log Sistem File dipilih di menu drop-down di bagian atas panel Log ). File log diperbarui dengan status permintaan Anda, yang akan terlihat seperti ini:

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

Menambahkan logika bisnis ke fungsi

Mari kita tambahkan logika ke fungsi, untuk memeriksa pembacaan suhu yang diterimanya, dan menetapkan status untuk setiap pembacaan suhu.

Fungsi kami mengharapkan berbagai pembacaan suhu. Cuplikan JSON berikut adalah contoh isi permintaan yang kami kirim ke fungsi kami. Nama array mungkin sedikit berbeda untuk JavaScript atau PowerShell, tetapi setiap entri dalam array memiliki ID, tanda waktu, dan suhu.

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

Mari kita ganti kode default dalam fungsi kita dengan kode berikut yang mengimplementasikan logika bisnis kita.

Di panel fungsi HttpTrigger1 , buka file index.js , dan ganti dengan kode berikut. Setelah membuat perubahan ini, pada bilah perintah, pilih Simpan untuk menyimpan pembaruan ke file.

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

Logika yang kami tambahkan sangat mudah. Kami melakukan iterasi melalui array dan mengatur status sebagai OK, CAUTION, atau DANGER berdasarkan nilai bidang suhu. Kami kemudian mengirim kembali array pembacaan dengan bidang status ditambahkan ke setiap entri.

Log Perhatikan pernyataan saat Anda memperluas Log di bagian bawah panel. Saat fungsi berjalan, pernyataan ini menambahkan pesan di jendela Log.

Uji logika bisnis kami

Kita akan menggunakan fitur Uji/Jalankan di Kode Pengembang>+ Uji untuk menguji fungsi kita.

  1. Pada tab Kode + Uji , pilih Uji/Jalankan. Di tab Input , ganti konten kotak teks Isi dengan kode berikut untuk membuat permintaan sampel kami.

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

Buka file run.ps1 , dan ganti konten dengan kode berikut. Setelah membuat perubahan ini, pada bilah perintah, pilih Simpan untuk menyimpan pembaruan ke file.

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

Logika yang kami tambahkan sangat mudah. Kami melakukan iterasi melalui array dan mengatur status sebagai OK, CAUTION, atau DANGER berdasarkan nilai bidang suhu. Kami kemudian mengirim kembali array pembacaan dengan bidang status ditambahkan ke setiap entri.

Perhatikan panggilan ke Write-Host cmdlet. Saat fungsi berjalan, pernyataan ini menambahkan pesan di jendela Log.

Menguji logika bisnis

Kita akan menggunakan fitur Uji/Jalankan di Kode Pengembang>+ Uji untuk menguji fungsi kita.

  1. Pada tab Kode + Uji , pilih Uji/Jalankan. Di tab Input , ganti konten kotak teks Isi dengan kode berikut untuk membuat permintaan sampel kami.

    {
        "Readings": [
            {
                "driveGearId": 1,
                "timestamp": 1534263995,
                "temperature": 23
            },
            {
                "driveGearId": 3,
                "timestamp": 1534264048,
                "temperature": 45
            },
            {
                "driveGearId": 18,
                "timestamp": 1534264050,
                "temperature": 55
            }
        ]
    }
    
  1. Pilih Jalankan. Tab Output menampilkan kode respons HTTP dan konten. Untuk melihat pesan log, buka tab Log di flyout panel (jika belum terbuka). Gambar berikut ini memperlihatkan contoh respons di panel output dan pesan di panel Log .

    Cuplikan layar editor fungsi Azure, dengan tab Uji dan Log ditampilkan.

    Tab Output menunjukkan bahwa bidang status ditambahkan dengan benar ke setiap pembacaan.