Oefening: Logica toevoegen aan de functie-app
Laten we doorgaan met het voorbeeld van de tandwielaandrijving en de logica voor de temperatuurservice toevoegen. We gaan gegevens ontvangen van een HTTP-aanvraag.
Functievereisten
We definiëren eerst enkele vereisten voor onze logica:
- Temperaturen van 0 tot 25 graden moeten worden gemarkeerd als OK.
- Temperaturen boven 25 tot 50 graden moeten als WAARSCHUWING worden gemarkeerd.
- Temperaturen boven 50 graden moeten worden gemarkeerd als GEVAARLIJK.
Een functie toevoegen aan uw functie-app
Zoals we in de vorige les hebben beschreven, biedt Azure sjablonen waarmee u functies kunt bouwen. In deze eenheid gebruikt u de HttpTrigger
sjabloon om de temperatuurservice te implementeren.
In de vorige oefening hebt u uw functie-app geïmplementeerd en geopend. Als deze nog niet is geopend, kunt u deze openen vanaf de startpagina door Alle resources te selecteren en vervolgens uw functie-app te selecteren, met de naam iets als roltrapfuncties-xxx.
Selecteer In het scherm Functie-app op het tabblad Functions de optie Maken in Azure Portal. Het deelvenster Functie maken wordt weergegeven.
Selecteer onder Selecteer een sjabloon de HTTP-trigger en selecteer Volgende.
Laat de naam van de functie staan als HttpTrigger1 en het autorisatieniveau als functie en selecteer Maken. De functie HttpTrigger1 wordt gemaakt en weergegeven in het deelvenster HttpTrigger1 .
Selecteer het tabblad Code + Test . De code-editor wordt geopend, met de inhoud van het index.js-codebestand voor uw functie. De standaardcode die door de HTTP-sjabloon wordt gegenereerd, wordt weergegeven in het volgende codefragment.
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 }; }
Uw functie verwacht dat een naam wordt doorgegeven via de querytekenreeks van de HTTP-aanvraag of als onderdeel van de aanvraagbody. De functie reageert door het bericht Hallo, naam> te <retourneren. Deze door HTTP geactiveerde functie is uitgevoerd., waarbij de naam wordt herhaald die in de aanvraag is verzonden.
Selecteer in de vervolgkeuzelijst van het bronbestand function.json om de configuratie van de functie weer te geven. Deze moet eruitzien als de volgende code.
{ "bindings": [ { "authLevel": "function", "type": "httpTrigger", "direction": "in", "name": "req", "methods": [ "get", "post" ] }, { "type": "http", "direction": "out", "name": "res" } ] }
Dit configuratiebestand declareert dat de functie wordt uitgevoerd wanneer deze een HTTP-aanvraag ontvangt. De uitvoerbinding declareert dat het antwoord wordt verzonden als een HTTP-antwoord.
Voer in de sectie Sjabloondetails, in het veld Nieuwe functie, DriveGearTemperatureService in. Laat het autorisatieniveau staan als functie en selecteer vervolgens Maken om de functie te maken. Het deelvenster Overzicht voor de functie DriveGearTemperatureService wordt weergegeven.
Selecteer Code + Test in het menu Functie. De code-editor wordt geopend met de inhoud van het codebestand run.ps1 . De standaardcode die met de sjabloon is gegenereerd, wordt vermeld in het volgende codefragment.
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 })
Voor de functie wordt verwacht dat er een naam wordt doorgegeven via de querytekenreeks van de HTTP-aanvraag of als onderdeel van de aanvraagbody. HTTP-functies moeten een antwoord genereren door te schrijven naar de uitvoerbinding. Dit wordt gedaan in PowerShell-functies met de cmdlet
Push-OutputBinding
. Deze functie retourneert het bericht Hello, $name, waarbij de naam wordt herhaald die in de aanvraag is verzonden.Selecteer in de vervolgkeuzelijst bron function.json om de configuratie van de functie weer te geven. Deze moet er als volgt uitzien.
{ "bindings": [ { "authLevel": "function", "type": "httpTrigger", "direction": "in", "name": "Request", "methods": [ "get", "post" ] }, { "type": "http", "direction": "out", "name": "Response" } ] }
Deze configuratie geeft aan dat de functie wordt uitgevoerd wanneer deze een HTTP-aanvraag ontvangt. De uitvoerbinding declareert dat het antwoord wordt verzonden als een HTTP-antwoord.
De functie testen
Tip
cURL is een opdrachtregelprogramma dat kan worden gebruikt om bestanden te verzenden of ontvangen. Het maakt deel uit van Linux, macOS en Windows 10 en kan worden gedownload voor de meeste andere besturingssystemen. cURL biedt ondersteuning voor talloze protocollen, zoals HTTP, HTTPS, FTP, FTPS, SFTP, LDAP, TELNET, SMTP, POP3 enzovoort. Zie de volgende koppelingen voor meer informatie:
Als u de functie wilt testen, kunt u een HTTP-aanvraag verzenden naar de functie-URL met behulp van cURL op de opdrachtregel.
Vouw het logboekframe onder aan het deelvenster triggerfunctie uit. Selecteer Bestandssysteemlogboeken in de vervolgkeuzelijst boven aan het logboekframe. Het logboekframe moet elke minuut beginnen met het ontvangen van traceringsmeldingen.
Als u de eindpunt-URL van de functie wilt vinden, selecteert u in de opdrachtbalk functie-URL ophalen, zoals wordt weergegeven in de volgende afbeelding. Bewaar deze koppeling door het pictogram Kopiëren naar klembord aan het eind van de URL te selecteren. Sla deze koppeling op in Kladblok of een vergelijkbare app voor later gebruik.
Open een opdrachtprompt en voer cURL uit om een HTTP-aanvraag naar de functie-URL te verzenden. Houd er rekening mee dat u de URL gebruikt die u in de vorige stap hebt gekopieerd.
curl "<your-https-url>"
Tip
Mogelijk moet u de URL tussen aanhalingstekens verpakken om problemen met speciale tekens in de URL te voorkomen.
Als u windows gebruikt, voert u deze uitcURL
vanaf de opdrachtprompt. PowerShell heeft een curl-opdracht , maar het is een alias voor Invoke-WebRequest, wat niet hetzelfde is alscURL
.Het antwoord moet er als volgt uitzien.
This HTTP triggered function executed successfully. Pass a name on the query string or in the request body for a personalized response.
Geef nu een naam door in de aanvraag. Hiervoor moet u een queryreeksparameter met de naam
name
toevoegen aan de URL. In het volgende voorbeeld wordt de querytekenreeksparametername=Azure
toegevoegd.curl "<your-https-url>&name=Azure"
Het antwoord moet er als volgt uitzien.
Hello, Azure. This HTTP triggered function executed successfully.
De functie is uitgevoerd en heeft de naam geretourneerd die u in de aanvraag hebt doorgegeven.
HTTP-triggers beveiligen
Met HTTP-triggers kunt u API-sleutels gebruiken om onbekende aanroepers te blokkeren door een sleutel als onderdeel van de aanvraag te vereisen. Als u een functie maakt, selecteert u de autorisatieniveau. Standaard is het niveau ingesteld op Functie. Hiervoor is een functiespecifieke API-sleutel vereist. Het kan ook worden ingesteld op Beheerder om een globale hoofdsleutel te gebruiken of Anoniem om aan te geven dat er geen sleutel is vereist. U kunt ook het autorisatieniveau via de functie-eigenschappen wijzigen nadat de functie is gemaakt.
Omdat u functie hebt opgegeven bij het maken van deze functie, moet u de sleutel opgeven wanneer u de HTTP-aanvraag verzendt. U kunt deze verzenden als een queryreeksparameter met de naam code
. Of gebruik de voorkeursmethode en geef deze door als een HTTP-header met de naam x-functions-key
.
Als u de functietoetsen wilt vinden, opent u het menu Code + Test door de naam van uw functie (bijvoorbeeld HttpTriger1) te selecteren onder het tabblad Functies in het menu Overzicht . Selecteer vervolgens het tabblad Functietoetsen .
Standaard is de waarde van de functiesleutel verborgen. Geef de standaardwaarde van de functiesleutel weer door Waarde weergeven te selecteren. Kopieer de inhoud van het veld Waarde naar het klembord en sla deze sleutel op in Kladblok of een vergelijkbare app voor later gebruik.
Als u de functie wilt testen met de functiesleutel, opent u een opdrachtprompt en voert u cURL uit om een HTTP-aanvraag naar de functie-URL te verzenden. Vervang
<your-function-key>
door de waarde van de functiesleutel die u hebt opgeslagen en vervang deze door<your-https-url>
de URL van uw functie.curl --header "Content-Type: application/json" --header "x-functions-key: <your-function-key>" --request POST --data "{\"name\": \"Azure Function\"}" <your-https-url>
Controleer de cURL-opdracht en controleer of deze de volgende waarden heeft:
- Heeft een
Content-Type
-headerwaarde van het typeapplication/json
toegevoegd. - Heeft de functietoets doorgegeven als de headerwaarde
x-functions-key
. - Heeft een
POST
-aanvraag gebruikt. - De Azure-functie doorgegeven met de URL voor uw functie.
- Heeft een
Controleer de logboeken.
In het deelvenster Code en test moet een sessie worden geopend met logboekbestanduitvoer (zorg ervoor dat bestandssysteemlogboeken zijn geselecteerd in de vervolgkeuzelijst boven aan het deelvenster Logboeken ). Het logboekbestand wordt bijgewerkt met de status van uw aanvraag. Dit moet er ongeveer als volgt uitzien:
```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)
```
Bedrijfslogica toevoegen aan de functie
Laten we de logica toevoegen aan de functie, de temperatuurmetingen controleren die deze ontvangt en een status instellen voor elke temperatuurleesfunctie.
De functie verwacht een matrix met temperatuurwaarden. Het volgende JSON-fragment is een voorbeeld van de aanvraagbody die we naar onze functie verzenden. De naam van de matrix kan enigszins afwijken voor JavaScript of PowerShell, maar elke vermelding in de matrix heeft een id, tijdstempel en temperatuur.
{
"Readings": [
{
"driveGearId": 1,
"timestamp": 1534263995,
"temperature": 23
},
{
"driveGearId": 3,
"timestamp": 1534264048,
"temperature": 45
},
{
"driveGearId": 18,
"timestamp": 1534264050,
"temperature": 55
}
]
}
Laten we de standaardcode in onze functie vervangen door de volgende code waarmee onze bedrijfslogica wordt geïmplementeerd.
Open in het functievenster HttpTrigger1 het index.js-bestand en vervang het door de volgende code. Nadat u deze wijziging hebt aangebracht, selecteert u Opslaan op de opdrachtbalk om de updates op te slaan in het bestand.
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();
};
De logica die we hebben toegevoegd, is vrij eenvoudig. We herhalen de matrix en stellen de status in op OK, WAARSCHUWING of GEVAAR op basis van de waarde van het temperatuurveld. We sturen vervolgens de matrix van waarden terug, waarbij aan elk item een statusveld is toegevoegd.
Let op de Log
instructies wanneer u Logboeken onderaan het deelvenster uitvouwt. Wanneer de functie wordt uitgevoerd, voegen deze instructies berichten toe in het venster Logboeken.
De bedrijfslogica testen
We gaan de functie Testen/uitvoeren gebruiken in Developer>Code + Test om onze functie te testen.
Selecteer Testen/uitvoeren op het tabblad Code + Test. Vervang op het tabblad Invoer de inhoud van het tekstvak Hoofdtekst door de volgende code om onze voorbeeldaanvraag te maken.
{ "readings": [ { "driveGearId": 1, "timestamp": 1534263995, "temperature": 23 }, { "driveGearId": 3, "timestamp": 1534264048, "temperature": 45 }, { "driveGearId": 18, "timestamp": 1534264050, "temperature": 55 } ] }
Open het bestand run.ps1 en vervang de inhoud door de volgende code. Nadat u deze wijziging hebt aangebracht, selecteert u Opslaan op de opdrachtbalk om de updates op te slaan in het bestand.
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
})
De logica die we hebben toegevoegd, is vrij eenvoudig. We herhalen de matrix en stellen de status in op OK, WAARSCHUWING of GEVAAR op basis van de waarde van het temperatuurveld. We sturen vervolgens de matrix van waarden terug, waarbij aan elk item een statusveld is toegevoegd.
Let op de aanroepen naar de cmdlet Write-Host
. Wanneer de functie wordt uitgevoerd, voegen deze instructies berichten toe in het venster Logboeken.
De bedrijfslogica testen
We gaan de functie Testen/uitvoeren gebruiken in Developer>Code + Test om onze functie te testen.
Selecteer Testen/uitvoeren op het tabblad Code + Test. Vervang op het tabblad Invoer de inhoud van het tekstvak Hoofdtekst door de volgende code om onze voorbeeldaanvraag te maken.
{ "Readings": [ { "driveGearId": 1, "timestamp": 1534263995, "temperature": 23 }, { "driveGearId": 3, "timestamp": 1534264048, "temperature": 45 }, { "driveGearId": 18, "timestamp": 1534264050, "temperature": 55 } ] }
Selecteer Uitvoeren. Op het tabblad Uitvoer worden de HTTP-antwoordcode en -inhoud weergegeven. Als u logboekberichten wilt zien, opent u het tabblad Logboeken in de onderste flyout van het deelvenster (als dit nog niet is geopend). De volgende afbeelding toont een voorbeeldantwoord in het uitvoerdeelvenster en berichten in het deelvenster Logboeken.
Op het tabblad Uitvoer ziet u dat een statusveld correct is toegevoegd aan elk van de metingen.
Selecteer Controleren in het menu Ontwikkelaars aan de linkerkant om te zien dat de aanvraag is geregistreerd bij Application Insights. Het deelvenster Monitor wordt weergegeven voor uw functie.
Op het tabblad Aanroepen van het deelvenster worden aanroeptraceringstraceringen weergegeven voor elk van uw functie-aanroepen. Selecteer de datumwaarde (UTC) voor een van de aanroepen en bekijk de details over de uitvoering van uw functie.