Übung: Hinzufügen von Logik zur Funktions-App
Fahren wir mit unserem Zahnradsteuerungs-Beispiel fort und fügen die Logik für den Temperaturdienst hinzu. Insbesondere werden wir Daten von einer HTTP-Anforderung empfangen.
Anforderungen an die Funktion
Zunächst müssen wir einige Anforderungen an unsere Logik definieren:
- Temperaturen von 0 bis 25 Grad sollten mit OK gekennzeichnet werden.
- Temperaturen über 25 bis 50 Grad sollen mit VORSICHT gekennzeichnet werden.
- Temperaturen über 50 Grad sollen mit DANGER gekennzeichnet werden.
Hinzufügen einer Funktion zu Ihrer Funktions-App
Wie in der vorherigen Lerneinheit beschrieben, stellt Azure Vorlagen bereit, mit denen Sie Funktionen erstellen können. In dieser Lerneinheit verwenden Sie die Vorlage HttpTrigger
, um den Temperaturdienst zu implementieren.
In der vorherigen Übung haben Sie Ihre Funktions-App bereitgestellt und geöffnet. Wenn diese noch nicht geöffnet ist, können Sie sie auf der Startseite öffnen, indem Sie Alle Ressourcen auswählen, und dann Ihre Funktions-App mit dem Namen escalator-functions-xxx auswählen.
Wählen Sie auf dem Bildschirm „Funktions-App“ auf der Registerkarte Functions die Option Im Azure-Portal erstellen aus. Der Bereich Funktion erstellen wird angezeigt.
Wählen Sie unter Vorlage auswählen die Option HTTP-Trigger aus und klicken Sie auf Weiter.
Lassen Sie den Funktionsnamen als HttpTrigger1 und die Autorisierungsstufe als Function und wählen Sie Erstellen aus. Die Funktion HttpTrigger1 wird erstellt und im Bereich HttpTrigger1-Funktion angezeigt.
Wählen Sie die Registerkarte Code + Test aus. Der Code-Editor wird geöffnet und zeigt die Inhalte der Codedatei index.js für Ihre Funktion an. Der Standardcode, den die HTTP-Vorlage generiert hat, wird im folgenden Codeausschnitt angezeigt.
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 }; }
Ihre Funktion erwartet einen Namen, der entweder über die Abfragezeichenfolge der HTTP-Anforderung oder als Teil des Anforderungstexts übergeben wird. Die Funktion antwortet, indem Sie die Meldung Hallo, <Name>. This HTTP triggered function executed succesfully. (Diese durch HTTP ausgelöste Funktion wurde erfolgreich ausgeführt) zurückgibt. Dabei wird der Name zurückgegeben, der in der Anforderung gesendet wurde.
Wählen Sie aus der Quellendatei-Dropdownliste function.json aus, um die Konfiguration der Funktion anzuzeigen, die wie der folgende Code aussehen sollte.
{ "bindings": [ { "authLevel": "function", "type": "httpTrigger", "direction": "in", "name": "req", "methods": [ "get", "post" ] }, { "type": "http", "direction": "out", "name": "res" } ] }
Die Konfigurationsdatei deklariert, dass die Funktion ausgeführt wird, sobald sie eine HTTP-Anforderung empfängt. Die Ausgabebindung deklariert, dass die Antwort als HTTP-Antwort gesendet wird.
Geben Sie im Abschnitt Vorlagendetails im Feld Neue Funktion den Namen DriveGearTemperatureService ein. Belassen Sie die Autorisierungsstufe als Funktion, und wählen Sie Erstellen aus, um die Funktion zu erstellen. Der Bereich „Übersicht“ für Ihre DriveGearTemperatureService-Funktion wird angezeigt.
Wählen Sie im Menü „Funktion“ Code + Test aus. Der Code-Editor wird mit dem Inhalt der Codedatei run.ps1 geöffnet. Der Standardcode, den die Vorlage für uns generiert hat, wird im folgenden Codeausschnitt aufgeführt.
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 })
Unsere Funktion erwartet einen Namen, der entweder über die Abfragezeichenfolge der HTTP-Anforderung oder als Teil des Anforderungstexts übergeben wird. HTTP-Funktionen müssen eine Antwort generieren, indem sie in ihre Ausgabebindung schreiben, was in PowerShell-Funktionen mit dem Cmdlet
Push-OutputBinding
erreicht wird. Die Funktion gibt die Meldung Hello, $name mit dem in der Anforderung gesendeten Namen aus.Wählen Sie in der Dropdownliste „Quelle“ die Datei function.json aus, um die Konfiguration der Funktion anzuzeigen, die in etwa wie folgt aussehen sollte.
{ "bindings": [ { "authLevel": "function", "type": "httpTrigger", "direction": "in", "name": "Request", "methods": [ "get", "post" ] }, { "type": "http", "direction": "out", "name": "Response" } ] }
Diese Konfiguration deklariert, dass die Funktion ausgeführt wird, sobald sie eine HTTP-Anforderung empfängt. Die Ausgabebindung deklariert, dass die Antwort als HTTP-Antwort gesendet wird.
Testen der Funktion
Tipp
cURL ist ein Befehlszeilentool, das zum Senden und Empfangen von Dateien verwendet werden kann. Es ist in Linux, MacOS und Windows 10 enthalten und kann für die meisten anderen Betriebssysteme heruntergeladen werden. cURL unterstützt zahlreiche Protokolle wie HTTP, HTTPS, FTP, FTPS, SFTP, LDAP, TELNET, SMTP, POP3 usw. Weitere Informationen finden Sie unter den folgenden Links:
Zum Testen der Funktion können Sie über die Befehlszeile mit cURL eine HTTP-Anforderung an die Funktions-URL senden.
Erweitern Sie den Frame Protokolle am unteren Rand des Triggerfunktionsbereichs. Wählen Sie in der Dropdownliste oben im Bereich „Protokolle“ die Option Dateisystemprotokolle aus. Im Protokollbereich sollten nun minütlich Ablaufverfolgungsbenachrichtigungen eingehen.
Um die Endpunkt-URL der Funktion zu suchen, wählen Sie auf der Befehlsleiste wie im folgenden Bild dargestellt Funktions-URL abrufen aus. Speichern Sie diesen Link, indem Sie am Ende der URL das Symbol In Zwischenablage kopieren auswählen. Speichern Sie diesen Link für die spätere Verwendung in Editor oder einer ähnlichen App.
Öffnen Sie eine Eingabeaufforderung, und führen Sie cURL aus, um eine HTTP-Anforderung an die Funktions-URL zu senden. Denken Sie daran, die URL zu verwenden, die Sie im vorherigen Schritt kopiert haben.
curl "<your-https-url>"
Tipp
Sie können die URL in Anführungszeichen einschließen, um Probleme mit Sonderzeichen in der URL zu vermeiden.
Wenn Sie Windows verwenden, führen SiecURL
an der Eingabeaufforderung aus. PowerShell verfügt über einen curl-Befehl, dieser ist jedoch ein Alias für „Invoke-WebRequest“ und nicht mitcURL
identisch.Die Antwort sollte wie folgt aussehen:
This HTTP triggered function executed successfully. Pass a name on the query string or in the request body for a personalized response.
Übergeben Sie nun einen Namen in der Anforderung. Dazu müssen Sie der URL einen Abfragezeichenfolgenparameter namens
name
hinzufügen. Im folgenden Beispiel wird der Abfragezeichenfolgenparametername=Azure
hinzugefügt.curl "<your-https-url>&name=Azure"
Die Antwort sollte wie folgt aussehen:
Hello, Azure. This HTTP triggered function executed successfully.
Die Funktion wurde erfolgreich ausgeführt und hat den Namen zurückgegeben, den Sie in der Anforderung übergeben haben.
Schützen von HTTP-Triggern
Mithilfe von HTTP-Triggern können Sie API-Schlüssel verwenden, um unbekannte Caller zu blockieren, indem ein Schlüssel für die Anforderung gefordert wird. Beim Erstellen einer Funktion wählen Sie die Autorisierungsstufe aus. Standardmäßig ist die Ebene auf Funktion festgelegt, sodass ein funktionsspezifischer API-Schlüssel erforderlich ist. Sie kann auch auf Administrator festgelegt werden, um einen globalen „Hauptschlüssel“ zu verwenden, oder auf Anonym, um anzugeben, dass kein Schlüssel erforderlich ist. Sie können die Autorisierungsstufe auch nach dem Erstellen über die Funktionseigenschaften ändern.
Da Sie bei der Erstellung dieser Funktion Funktion angegeben haben, müssen Sie beim Senden der HTTP-Anforderung den Schlüssel angeben. Sie können es als Abfragezeichenfolgenparameter mit dem Namen code
senden. Oder verwenden Sie die bevorzugte Methode, und übergeben Sie es als HTTP-Header mit dem Namen x-functions-key
.
Um die Funktionstasten zu finden, öffnen Sie das Menü Code + Test, indem Sie den Namen Ihrer Funktion (z. B. HttpTriger1) unter der Registerkarte Funktionen im Menü Übersicht auswählen. Wählen Sie dann die Registerkarte Funktionstasten aus.
Der Wert des Funktionsschlüssels ist standardmäßig ausgeblendet. Zeigen Sie den Standardfunktionsschlüsselwert an, indem Sie Wert anzeigen auswählen. Kopieren Sie Inhalte des Felds Wert in die Zwischenablage, und speichern Sie dann diesen Schlüssel zur späteren Verwendung im Editor oder einer ähnlichen App.
Um die Funktion mit dem Funktionsschlüssel zu testen, öffnen Sie eine Eingabeaufforderung, und führen Sie cURL aus, um eine HTTP-Anforderung an die Funktions-URL zu senden. Ersetzen Sie
<your-function-key>
durch den Wert des Funktionsschlüssels, den Sie gespeichert haben, und ersetzen Sie<your-https-url>
durch die URL Ihrer Funktion.curl --header "Content-Type: application/json" --header "x-functions-key: <your-function-key>" --request POST --data "{\"name\": \"Azure Function\"}" <your-https-url>
Überprüfen Sie den cURL-Befehl, und vergewissern Sie sich, dass der folgende Werte aufweist:
- Sie fügen einen Headerwert für
Content-Type
mit dem Typapplication/json
hinzu. - Sie übergeben den Funktionsschlüssel als den Headerwert
x-functions-key
. - Sie verwenden eine
POST
-Anforderung. - Sie haben die Azure-Funktion mit der URL für Ihre Funktion übergeben.
- Sie fügen einen Headerwert für
Überprüfen Sie die Protokolle.
Der Bereich Programmieren und testen sollte eine Sitzung öffnen, die die Protokolldateiausgabe anzeigt (stellen Sie sicher, dass in der Dropdownliste oben im Bereich Protokolle die Option Dateisystemprotokolle ausgewählt ist). Die Protokolldatei wird mit dem Status Ihrer Anforderung aktualisiert, und die Anzeige sollte in etwa wie folgt aussehen:
```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)
```
Hinzufügen von Geschäftslogik zur Funktion
Fügen wir die Logik zur Funktion hinzu, die die empfangenen Temperaturmesswerte überprüft und für jeden gemessenen Wert einen Status festlegt.
Unsere Funktion erwartet ein Array von Temperaturmesswerten. Der folgende JSON-Codeausschnitt ist ein Beispiel für den Anforderungstext, den wir an unsere Funktion senden. Der Name des Arrays kann bei JavaScript oder PowerShell geringfügig abweichen, aber jeder Eintrag im Array weist eine ID, einen Zeitstempel und eine Temperatur auf.
{
"Readings": [
{
"driveGearId": 1,
"timestamp": 1534263995,
"temperature": 23
},
{
"driveGearId": 3,
"timestamp": 1534264048,
"temperature": 45
},
{
"driveGearId": 18,
"timestamp": 1534264050,
"temperature": 55
}
]
}
Wir ersetzen den Standardcode in unserer Funktion durch den folgenden Code, der unsere Geschäftslogik implementiert.
Öffnen Sie im Bereich der Funktion HttpTrigger1 die Datei index.js, und ersetzen Sie sie durch den folgenden Code. Wählen Sie nach dem Durchführen dieser Änderung in der Befehlsleiste Speichern aus, um die Aktualisierungen an der Datei zu speichern.
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();
};
Die Logik, die wir hinzugefügt haben, ist einfach. Wir durchlaufen das Array und legen den Status basierend auf dem Wert im Temperaturfeld auf OK, CAUTION oder DANGER fest. Wir senden dann das Array von Messwerten mit einem zu jedem Eintrag hinzugefügten Statusfeld zurück.
Beachten Sie die Log
-Anweisungen, wenn Sie unten im Bereich Protokolle erweitern. Wenn die Funktion ausgeführt wird, fügen diese Anweisungen Nachrichten zum Protokollfenster hinzu.
Testen der Geschäftslogik
Wir verwenden das Feature Testen/Ausführen in Entwickler>Programmieren und testen, um unsere Funktion zu testen.
Wählen Sie auf der Registerkarte Code + Test Test/Ausführen aus. Ersetzen Sie auf der Registerkarte Eingabe den Inhalt im Feld Textteil durch den folgenden Code, um die Beispielanforderung zu erstellen.
{ "readings": [ { "driveGearId": 1, "timestamp": 1534263995, "temperature": 23 }, { "driveGearId": 3, "timestamp": 1534264048, "temperature": 45 }, { "driveGearId": 18, "timestamp": 1534264050, "temperature": 55 } ] }
Öffnen Sie die Datei run.ps1, und ersetzen Sie den Inhalt durch den folgenden Code. Wählen Sie nach dem Durchführen dieser Änderung in der Befehlsleiste Speichern aus, um die Aktualisierungen an der Datei zu speichern.
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
})
Die Logik, die wir hinzugefügt haben, ist einfach. Wir durchlaufen das Array und legen den Status basierend auf dem Wert im Temperaturfeld auf OK, CAUTION oder DANGER fest. Wir senden dann das Array von Messwerten mit einem zu jedem Eintrag hinzugefügten Statusfeld zurück.
Notieren Sie sich die Aufrufe des Cmdlets Write-Host
. Wenn die Funktion ausgeführt wird, fügen diese Anweisungen Nachrichten zum Protokollfenster hinzu.
Testen der Geschäftslogik
Wir verwenden das Feature Testen/Ausführen in Entwickler>Programmieren und testen, um unsere Funktion zu testen.
Wählen Sie auf der Registerkarte Code + Test Test/Ausführen aus. Ersetzen Sie auf der Registerkarte Eingabe den Inhalt im Feld Textteil durch den folgenden Code, um die Beispielanforderung zu erstellen.
{ "Readings": [ { "driveGearId": 1, "timestamp": 1534263995, "temperature": 23 }, { "driveGearId": 3, "timestamp": 1534264048, "temperature": 45 }, { "driveGearId": 18, "timestamp": 1534264050, "temperature": 55 } ] }
Klicken Sie auf Run (Ausführen). Auf der Registerkarte Ausgabe werden der HTTP-Antwortcode und der Inhalt angezeigt. Öffnen Sie die Registerkarte Protokolle im unteren Flyout des Bereichs (sofern diese noch nicht geöffnet ist), um die Protokollmeldungen anzuzeigen. In der folgenden Abbildung ist eine Beispielantwort im Ausgabebereich und Nachrichten im Bereich Protokolle dargestellt.
Auf der Registerkarte Ausgabe wird angezeigt, dass jedem der Messwerte ordnungsgemäß ein Statusfeld hinzugefügt wurde.
Wählen Sie links im Menü „Entwickler“ die Option Überwachen aus, um zu überprüfen, ob die Anforderung in Application Insights protokolliert wurde. Der Bereich Programmieren und testen für Ihre Funktion wird angezeigt.
Auf der Registerkarte Aufrufe des Bereichs werden Aufrufablaufverfolgungen für jeden Aufruf ihrer Funktion angezeigt. Wählen Sie den Datumswert (UTC) für einen der Aufrufe aus, und zeigen Sie die Details zur Ausführung Ihrer Funktion an.