Cvičení – přidání logiky do aplikace funkcí

Dokončeno

Teď rozvineme náš příklad s ozubeným převodem a přidáme logiku pro službu teploty. Konkrétně budeme přijímat data z požadavku HTTP.

Požadavky na funkci

Nejprve potřebujeme definovat několik požadavků na naši logiku:

  • Teploty od 0 do 25 stupňů by měly být označeny jako OK.
  • Teploty nad 25 až 50 stupňů by měly být označeny jako UPOZORNĚNÍ.
  • Teploty nad 50 stupňů ať se označí výstrahou NEBEZPEČÍ.

Přidání funkce do aplikace funkcí

Jak jsme popsali v předchozí lekci, Azure poskytuje šablony, které vám pomůžou sestavovat funkce. V této lekci použijete HttpTrigger šablonu k implementaci služby teploty.

  1. V předchozím cvičení jste nasadili aplikaci funkcí a otevřeli ji. Pokud ještě není otevřený, můžete ho otevřít na domovské stránce tak, že vyberete Všechny prostředky a pak vyberete aplikaci funkcí s názvem eskalátor-functions-xxx.

  2. Na obrazovce Aplikace funkcí na kartě Funkce vyberte Vytvořit na webu Azure Portal. Zobrazí se podokno Vytvořit funkci .

  3. V části Vybrat šablonu vyberte trigger HTTP.

  1. Vyberte Vytvořit. Vytvoří se HttpTrigger1 a zobrazí se v podokně funkce HttpTrigger1 .

  2. V nabídce Vývojář na levé straně vyberte Kód + Test. Otevře se editor kódu zobrazující obsah souboru kódu index.js pro vaši funkci. Výchozí kód vygenerovaný šablonou HTTP se zobrazí v následujícím fragmentu kódu.

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

    Vaše funkce očekává předání názvu buď prostřednictvím řetězce dotazu požadavku HTTP, nebo jako součást textu požadavku. Funkce odpoví vrácením zprávy Hello, <name>. Tato funkce aktivovaná protokolem HTTP se úspěšně spustila. Vrátí se zpět název , který byl odeslán v požadavku.

    V rozevíracím seznamu zdrojového souboru vyberte function.json a zobrazte konfiguraci funkce, která by měla vypadat jako následující kód.

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

    Tento konfigurační soubor deklaruje, že funkce se spustí, když obdrží požadavek HTTP. Výstupní vazba deklaruje, že se odpověď odešle jako odpověď HTTP.

  1. V části Podrobnosti šablony do pole Nová funkce zadejte DriveGearTemperatureService. Úroveň autorizace ponechte jako funkci a pak ji vytvořte výběrem možnosti Vytvořit. Zobrazí se podokno Přehled funkce DriveGearTemperatureService .

  2. V nabídce Funkce vyberte Kód + Test. Otevře se editor kódu s obsahem souboru kódu run.ps1 . Výchozí kód vygenerovaný šablonou je uvedený v následujícím fragmentu kódu.

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

    Funkce očekává, že jí bude předáno jméno: buď prostřednictvím řetězce dotazu požadavku HTTP, nebo jako součást textu požadavku. Funkce HTTP musí vygenerovat odpověď zápisem do jejich výstupní vazby, což se ve funkcích PowerShellu provádí pomocí rutiny Push-OutputBinding. Tato funkce vrátí zprávu Hello, $name a vrátí zpět název, který byl odeslán v požadavku.

  3. V rozevíracím seznamu zdroje vyberte function.json a zobrazte konfiguraci funkce, která by měla vypadat takto.

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

    Tato konfigurace deklaruje, že se funkce spustí, když obdrží požadavek HTTP. Výstupní vazba deklaruje, že se odpověď odešle jako odpověď HTTP.

Testování funkce

Tip

cURL je nástroj příkazového řádku, který se používá k odesílání nebo přijímání souborů. Je součástí systémů Linux, macOS a Windows 10 a dá se stáhnout také pro většinu ostatních operačních systémů. Nástroj cURL podporuje řadu protokolů, mimo jiné HTTP, HTTPS, FTP, FTPS, SFTP, LDAP, TELNET, SMTP, POP3 a další. Další informace najdete na následujících odkazech:

Pokud chcete funkci otestovat, můžete na její adresu URL odeslat požadavek HTTP pomocí nástroje cURL na příkazovém řádku.

  1. Rozbalte rámeček Protokoly v dolní části podokna funkce triggeru. V rozevíracím seznamu v horní části rámce Protokolů vyberte protokoly systému souborů. Rámeček protokolu by měl začínat každou minutu nabíhání oznámení trasování.

  2. Pokud chcete najít adresu URL koncového bodu funkce, na panelu příkazů vyberte Získat adresu URL funkce, jak je znázorněno na následujícím obrázku. Vyberte ikonu Zkopírovat do schránky na konci adresy URL a tento odkaz si uložte. Uložte tento odkaz do Poznámkový blok nebo podobné aplikace pro pozdější použití.

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

  3. Otevřete příkazový řádek a spusťte cURL pro odeslání požadavku HTTP na adresu URL funkce. Nezapomeňte použít adresu URL, kterou jste zkopírovali v předchozím kroku.

    curl "<your-https-url>"
    

    Tip

    Možná budete muset zabalit adresu URL do uvozovek, abyste se vyhnuli problémům se speciálními znaky v adrese URL.
    Pokud používáte Windows, spusťte cURL ho z příkazového řádku. PowerShell má příkaz curl , ale je to alias pro Invoke-WebRequest, který není stejný jako cURL.

    Odpověď by měla vypadat nějak takto.

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

    Teď v požadavku předejte název. K tomu je potřeba přidat parametr řetězce dotazu pojmenovaný name na adresu URL. Následující příklad přidá parametr name=Azureřetězce dotazu .

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

    Odpověď by měla vypadat nějak takto.

    Hello, Azure. This HTTP triggered function executed successfully.
    

    Funkce se úspěšně spustila a vrátila název, který jste předali v požadavku.

Zabezpečení triggerů HTTP

Triggery HTTP umožňují používat klíče rozhraní API k blokování neznámých volajících tím, že v rámci požadavku vyžadují klíč. Při vytvoření funkce určíte úroveň autorizace. Ve výchozím nastavení je nastavená na funkci, která vyžaduje klíč rozhraní API specifický pro funkci. Můžete ho také nastavit tak, aby Správa použít globální hlavní klíč nebo Anonymní, aby bylo možné označit, že není vyžadován žádný klíč. Úroveň autorizace můžete změnit i po vytvoření funkce v jejích vlastnostech.

Vzhledem k tomu, že jste při vytváření této funkce zadali funkci , musíte při odesílání požadavku HTTP zadat klíč. Můžete ho odeslat jako parametr řetězce dotazu s názvem code. Nebo použijte upřednostňovanou metodu a předejte ji jako hlavičku HTTP s názvem x-functions-key.

  1. Pokud chcete najít funkci a hlavní klíče, v nabídce Aplikace funkcí v části Vývojář vyberte Klíče funkcí. Otevře se podokno Klíče funkcí pro vaši funkci.

  2. Ve výchozím nastavení je hodnota klíče funkce skrytá. Výběrem možnosti Zobrazit hodnotu zobrazíte výchozí hodnotu klíče funkce. Zkopírujte obsah pole Hodnota do schránky a uložte tento klíč do Poznámkový blok nebo podobné aplikace pro pozdější použití.

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

  3. Pokud chcete funkci otestovat pomocí funkčního klíče, otevřete příkazový řádek a spuštěním příkazu cURL odešlete požadavek HTTP na adresu URL funkce. Nahraďte <your-function-key> hodnotou klíče funkce, kterou jste uložili, a nahraďte <your-https-url> adresou URL funkce.

    curl --header "Content-Type: application/json" --header "x-functions-key: <your-function-key>" --request POST --data "{\"name\": \"Azure Function\"}" <your-https-url>
    
  4. Zkontrolujte příkaz cURL a ověřte, že obsahuje následující hodnoty:

    • Přidala se hodnota hlavičky Content-Type typu application/json.
    • Předal se klíč funkce jako hodnota hlavičky x-functions-key.
    • Použil se požadavek POST.
    • Funkce Azure Functions předala adresu URL vaší funkce.
  5. Zkontrolujte protokoly.

    V podokně Kód a testování by se měla otevřít relace zobrazující výstup souboru protokolu (ujistěte se, že jsou v rozevíracím seznamu v horní části podokna Protokoly vybrané protokoly protokoly). Soubor protokolu se aktualizuje se stavem vaší žádosti, který by měl vypadat nějak takto:

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

Přidání obchodní logiky do funkce

Pojďme do funkce přidat logiku, zkontrolovat hodnoty teploty, které přijímá, a nastavit stav pro každé čtení teploty.

Naše funkce očekává pole hodnot teploty. Následující fragment kódu JSON je příkladem textu požadavku, který do funkce odešleme. Každá položka reading obsahuje ID, časové razítko a teplotu.

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

Pojďme nahradit výchozí kód v naší funkci následujícím kódem, který implementuje naši obchodní logiku.

V podokně funkce HttpTrigger1 otevřete soubor index.js a nahraďte ho následujícím kódem. Po provedení této změny na panelu příkazů vyberte Uložit a uložte aktualizace souboru.

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

Námi přidaná logika je jednoduchá. Iterujeme pole a nastavíme stav jako OK, POZOR nebo NEBEZPEČÍ na základě hodnoty pole teploty. Potom odešleme zpět pole hodnot s polem stavu přidaným ke každé položce.

Log Všimněte si příkazů, když rozbalíte protokoly v dolní části podokna. Při spuštění funkce tyto příkazy přidávají zprávy v okně Protokoly.

Otevřete soubor run.ps1 a nahraďte jeho obsah následujícím kódem. Po provedení této změny na panelu příkazů vyberte Uložit a uložte aktualizace souboru.

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

Námi přidaná logika je jednoduchá. Iterujeme pole a nastavíme stav jako OK, POZOR nebo NEBEZPEČÍ na základě hodnoty pole teploty. Potom odešleme zpět pole hodnot s polem stavu přidaným ke každé položce.

Všimněte si volání rutiny Write-Host. Při spuštění funkce tyto příkazy přidávají zprávy v okně Protokoly.

Testování obchodní logiky

K otestování naší funkce použijeme funkci Test/Run v kódu vývojáře>+ test.

  1. Na kartě Vstup nahraďte obsah textového pole Text následujícím kódem, který vytvoří náš ukázkový požadavek.

    {
        "readings": [
            {
                "driveGearId": 1,
                "timestamp": 1534263995,
                "temperature": 23
            },
            {
                "driveGearId": 3,
                "timestamp": 1534264048,
                "temperature": 45
            },
            {
                "driveGearId": 18,
                "timestamp": 1534264050,
                "temperature": 55
            }
        ]
    }
    
  2. Vyberte Spustit. Na kartě Výstup se zobrazí kód odpovědi HTTP a obsah. Pokud chcete zobrazit zprávy protokolu, otevřete kartu Protokoly v dolním informačním rámečku podokna (pokud ještě není otevřená). Následující obrázek ukazuje příklad odpovědi v podokně výstupu a zprávy v podokně Protokoly.

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

    Na kartě Výstup je vidět, že se do každého čtení správně přidalo pole stavu.

  3. V nabídce Vývojář na levé straně vyberte Sledovat, abyste viděli, že žádost byla zaprotokolována do Přehledy aplikace. Pro vaši funkci se zobrazí podokno Monitorování .

    Karta Vyvolání v podokně zobrazuje vyvolání trasování pro každou vyvolání funkce. Vyberte hodnotu Date(UTC) pro jedno z vyvolání a zobrazte podrobnosti o spuštění funkce.