Övning – Lägga till logik i funktionsappen

Slutförd

Vi fortsätter med vårt exempel om kugghjulsdrift och lägger till logiken för temperaturtjänsten. Mer specifikt tar vi emot data från en HTTP-begäran.

Funktionskrav

Först måste vi definiera vissa krav för vår logik:

  • Temperaturer från 0 upp till 25 grader ska flaggas som OK.
  • Temperaturer över 25 upp till 50 grader ska flaggas som VARNING.
  • Temperaturer över 50 grader ska flaggas som DANGER.

Lägga till en funktion i funktionsappen

Som vi beskrev i föregående lektion tillhandahåller Azure mallar som hjälper dig att skapa funktioner. I den här lektionen använder du mallen HttpTrigger för att implementera temperaturtjänsten.

  1. I föregående övning distribuerade du funktionsappen och öppnade den. Om den inte redan är öppen kan du öppna den från startsidan genom att välja Alla resurser och sedan välja funktionsappen med namnet escalator-functions-xxx.

  2. På skärmen Funktionsapp under fliken Funktioner väljer du Skapa i Azure Portal. Fönstret Skapa funktion visas.

  3. Under Välj en mall väljer du HTTP-utlösare och väljer Nästa.

  1. Låt funktionsnamnet vara HttpTrigger1 och auktoriseringsnivå som funktion och välj Skapa. Funktionen HttpTrigger1 skapas och visas i fönstret HttpTrigger1-funktion .

  2. Välj fliken Kod + test. Kodredigeraren öppnas och visar innehållet i index.js-kodfilen för din funktion. Standardkoden som HTTP-mallen genererade visas i följande kodfragment.

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

    Funktionen förväntar sig att ett namn skickas antingen via HTTP-frågesträngen för begäran eller som en del av begärandetexten. Funktionen svarar genom att returnera meddelandet Hello, <name>. Den här HTTP-utlösta funktionen har körts., vilket upprepar namnet som skickades i begäran.

    I listrutan källfil väljer du function.json för att visa konfigurationen av funktionen, som bör se ut som följande kod.

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

    Den här konfigurationsfilen deklarerar att funktionen körs när den tar emot en HTTP-begäran. Utdatabindningen deklarerar att svaret skickas som ett HTTP-svar.

  1. I avsnittet Mallinformation, i fältet Ny funktion, skriver du DriveGearTemperatureService. Lämna auktoriseringsnivån som Funktion och välj sedan Skapa för att skapa funktionen. Fönstret Översikt för din DriveGearTemperatureService-funktion visas.

  2. På funktionsmenyn väljer du Kod + Test. Kodredigeraren öppnas med innehållet i run.ps1-kodfilen . Standardkoden som mallen har genererat åt oss visas i följande kodavsnitt.

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

    Funktionen förväntar sig att ett namn skickas i frågesträngen för HTTP-begäran eller som en del av själva begäran. HTTP-funktioner måste generera ett svar genom att skriva till utdatabindningen, som utförs i PowerShell-funktioner med Push-OutputBinding-cmdleten. Den här funktionen returnerar meddelandet Hello, $name, som upprepar namnet som skickades i begäran.

  3. I listrutan källa väljer du function.json för att visa konfigurationen av funktionen, vilket bör se ut så här.

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

    Konfigurationen fastställer att funktionen körs när den får en HTTP-begäran. Utdatabindningen deklarerar att svaret skickas som ett HTTP-svar.

Testa funktionen

Dricks

cURL är ett kommandoradsverktyg som kan användas för att skicka och ta emot filer. Det ingår i Linux, macOS och Windows 10 och kan laddas ned för de flesta andra operativsystem. cURL har stöd för en rad protokoll, till exempel HTTP, HTTPS, FTP, FTPS, SFTP, LDAP, TELNET, SMTP och POP3. Mer information finns på följande länkar:

Om du vill testa funktionen kan du skicka en HTTP-begäran till funktions-URL:en med hjälp av cURL på kommandoraden.

  1. Expandera ramen Loggar längst ned i funktionsfönstret för utlösaren. Välj Filsystemloggar i listrutan överst i ramen Loggar. Loggramen bör börja samla spårningsmeddelanden varje minut.

  2. Om du vill hitta funktionens slutpunkts-URL går du till kommandofältet och väljer Hämta funktions-URL, som du ser i följande bild. Spara länken genom att välja ikonen Kopiera till Urklipp vid slutet av URL:en. Lagra den här länken i Anteckningar eller en liknande app för senare användning.

    Skärmbild av Azure Portal med funktionsredigeraren, där knappen Get function URL (Hämta funktions-URL) är markerad.

  3. Öppna en kommandotolk och kör cURL för att skicka en HTTP-begäran till funktions-URL:en. Tänk på att använda url:en som du kopierade i föregående steg.

    curl "<your-https-url>"
    

    Dricks

    Du kan behöva omsluta URL:en med citattecken för att undvika problem med specialtecken i URL:en.
    Om du använder Windows kör cURL du från kommandotolken. PowerShell har ett curl-kommando , men det är ett alias för Invoke-WebRequest, som inte är samma som cURL.

    Svaret bör se ut så här.

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

    Skicka nu ett namn i begäran. För att göra det måste du lägga till en frågesträngsparameter med namnet name i URL:en. Följande exempel lägger till frågesträngsparametern name=Azure.

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

    Svaret bör se ut så här.

    Hello, Azure. This HTTP triggered function executed successfully.
    

    Funktionen har körts och returnerat det namn som du skickade i begäran.

Skydda HTTP-utlösare

MED HTTP-utlösare kan du använda API-nycklar för att blockera okända anropare genom att kräva en nyckel som en del av begäran. När du skapar en funktion väljer du auktoriseringsnivån. Som standard är nivån inställd på Funktion, vilket kräver en funktionsspecifik API-nyckel. Det kan också ställas in på Administratör för att använda en global "huvudnyckel" eller Anonym för att indikera att ingen nyckel krävs. Du kan också ändra åtkomstnivån via funktionens egenskaper när du har skapat den.

Eftersom du angav Funktion när du skapade den här funktionen måste du ange nyckeln när du skickar HTTP-begäran. Du kan skicka den som en frågesträngsparameter med namnet code. Du kan också använda den önskade metoden och skicka den som ett HTTP-huvud med namnet x-functions-key.

  1. Om du vill hitta funktionsnycklarna öppnar du menyn Kod + Test genom att välja namnet på din funktion (till exempel HttpTriger1) under fliken Funktionermenyn Översikt . Välj sedan fliken Funktionsnycklar.

  2. Som standard är funktionsnyckelvärdet dolt. Visa standardvärdet för funktionsnyckeln genom att välja Visa värde. Kopiera innehållet i fältet Värde till Urklipp och lagra sedan den här nyckeln i Anteckningar eller en liknande app för senare användning.

    Skärmbild som visar fönstret Funktionsnycklar med den visade funktionsnyckeln markerad.

  3. Om du vill testa funktionen med funktionsnyckeln öppnar du en kommandotolk och kör cURL för att skicka en HTTP-begäran till funktions-URL:en. Ersätt <your-function-key> med funktionsnyckelvärdet som du sparade och ersätt <your-https-url> med funktionens URL.

    curl --header "Content-Type: application/json" --header "x-functions-key: <your-function-key>" --request POST --data "{\"name\": \"Azure Function\"}" <your-https-url>
    
  4. Granska cURL-kommandot och kontrollera att det har följande värden:

    • La till ett Content-Type-huvudvärde av typen application/json.
    • Skickade funktionsnyckeln som huvudvärdet x-functions-key.
    • Använde en POST-begäran.
    • Skickade Azure-funktionen med URL:en för din funktion.
  5. Kontrollera loggarna.

    Fönstret Kod + test bör öppna en session som visar loggfilutdata (se till att Filsystemloggar är markerade i listrutan överst i fönstret Loggar). Loggfilen uppdateras med status för din begäran, vilket bör se ut ungefär så hä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)
```

Lägga till affärslogik i funktionen

Nu ska vi lägga till logiken i funktionen för att kontrollera temperaturavläsningar som den tar emot och ange status för varje temperaturavläsning.

Funktionen förväntar sig en matris med temperaturavläsningar. Följande JSON-kodfragment är ett exempel på begärandetexten som vi skickar till vår funktion. Namnet på matrisen kan vara något annorlunda för JavaScript eller PowerShell, men varje post i matrisen har ett ID, tidsstämpel och temperatur.

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

Nu ska vi ersätta standardkoden i vår funktion med följande kod som implementerar vår affärslogik.

I funktionsfönstret HttpTrigger1 öppnar du filen index.js och ersätter den med följande kod. När du har gjort den här ändringen går du till kommandofältet och väljer Spara för att spara uppdateringarna i filen.

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

Logiken som vi lade till är enkel. Vi itererar genom matrisen och anger statusen som OK, CAUTION eller DANGER baserat på värdet för temperaturfältet. Sedan skickar vi tillbaka matrisen med avläsningar med ett tillagt statusfält i varje post.

Observera instruktionerna Log när du expanderar Loggar längst ned i fönstret. När funktionen körs lägger dessa instruktioner till meddelanden i fönstret Loggar.

Testa affärslogiken

Vi ska använda funktionen Test/Run i Developer>Code + Test för att testa vår funktion.

  1. På fliken Kod + test väljer du Test/Kör. På fliken Indata ersätter du innehållet i textrutan Brödtext med följande kod för att skapa vår exempelbegäran.

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

Öppna filen run.ps1 och ersätt innehållet med följande kod. När du har gjort den här ändringen går du till kommandofältet och väljer Spara för att spara uppdateringarna i filen.

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

Logiken som vi lade till är enkel. Vi itererar genom matrisen och anger statusen som OK, CAUTION eller DANGER baserat på värdet för temperaturfältet. Sedan skickar vi tillbaka matrisen med avläsningar med ett tillagt statusfält i varje post.

Observera anropen till Write-Host-cmdleten. När funktionen körs lägger dessa instruktioner till meddelanden i fönstret Loggar.

Testa affärslogik

Vi ska använda funktionen Test/Run i Developer>Code + Test för att testa vår funktion.

  1. På fliken Kod + test väljer du Test/Kör. På fliken Indata ersätter du innehållet i textrutan Brödtext med följande kod för att skapa vår exempelbegäran.

    {
        "Readings": [
            {
                "driveGearId": 1,
                "timestamp": 1534263995,
                "temperature": 23
            },
            {
                "driveGearId": 3,
                "timestamp": 1534264048,
                "temperature": 45
            },
            {
                "driveGearId": 18,
                "timestamp": 1534264050,
                "temperature": 55
            }
        ]
    }
    
  1. Markera Kör. Fliken Utdata visar HTTP-svarskoden och innehållet. Om du vill se loggmeddelanden öppnar du fliken Loggar längst ned i fönstret (om den inte redan är öppen). På följande bild visas ett exempelsvar i utdatafönstret och meddelanden i fönstret Loggar.

    Skärmbild av Azure-funktionsredigeraren med flikarna Test och Loggar.

    Fliken Utdata visar att ett statusfält har lagts till korrekt i var och en av avläsningarna.

  2. I menyn Utvecklare till vänster väljer du Övervaka för att se att begäran loggades till Application Insights. Fönstret Övervaka visas för din funktion.

    Fliken Anrop i fönstret visar anropsspårningar för var och en av dina funktionsanrop. Välj värdet Date(UTC) för ett av anropen och visa information om körningen av funktionen.