Übung: Verwenden eines benutzerdefinierten Handlers zum Erstellen einer App
In dieser Übung erstellen Sie eine serverlose App und führen sie mit Go aus.
Erstellen des Gerüsts für die App
Beginnen Sie mit dem Erstellen des Gerüsts der App, indem Sie die Azure Functions-Erweiterung in Visual Studio Code verwenden.
- Wählen Sie Ansicht>Befehlspalette aus.
- Klicken Sie auf Azure Functions: Create New Project (Azure Functions: Neues Projekt erstellen).
- Wählen Sie einen Ordner aus, in der Regel Ihren aktuellen Ordner.
- Wählen Sie unter Sprache auswählen die Option Benutzerdefinierter Handler.
- Wählen Sie in Vorlage für Ihre erste Funktion auswählen die Option HttpTrigger aus.
- Geben Sie der App einen Namen, z. B. hello.
- Wählen Sie die Autorisierungsebene anonym aus. Sie können das später ändern, wenn Sie möchten.
Jetzt verfügen Sie über ein Projekt, das in etwa wie folgt aussieht:
hello/
function.json
.funcignore
.gitignore
host.json
local.settings.json
proxies.json
Erstellen der App
In den nächsten Schritten geht es darum, eine App zu erstellen, die auf einen HTTP-Trigger reagieren kann.
Erstellen Sie im Projektstamm eine Datei namens server.go.
Weisen Sie server.go den folgenden Inhalt zu:
package main import ( "fmt" "io/ioutil" "log" "net/http" "os" )
Der vorangehende Code importiert alle Bibliotheken, die Sie zum Erstellen einer HTTP-App und zum Suchen von Umgebungsvariablen benötigen.
Fügen Sie nach den Importanweisungen den folgenden Code hinzu:
func main() { customHandlerPort, exists := os.LookupEnv("FUNCTIONS_CUSTOMHANDLER_PORT") if !exists { customHandlerPort = "8080" } mux := http.NewServeMux() // mux.HandleFunc("/api/hello", helloHandler) fmt.Println("Go server Listening on: ", customHandlerPort) log.Fatal(http.ListenAndServe(":"+customHandlerPort, mux)) }
Die
main()
-Funktion wird von selbst aufgerufen. Die erste Codezeile gibt an, wie aus der UmgebungsvariablenFUNCTIONS_CUSTOM_HANDLER_PORT
gelesen wird:customHandlerPort, exists := os.LookupEnv("FUNCTIONS_CUSTOMHANDLER_PORT")
Als nächstes prüft die Funktion, ob der Port vorhanden ist. Andernfalls wird der Funktion Port 8080 zugewiesen:
if !exists { customHandlerPort = "8080" }
Der nächste Code instanziiert eine HTTP-Serverinstanz:
mux := http.NewServeMux()
Die letzte wichtige Zeile ist diejenige, die an einem bestimmten Port lauscht und signalisiert, dass sie bereit ist, Anforderungen mit der Methode
ListenAndServe()
zu empfangen:log.Fatal(http.ListenAndServe(":"+customHandlerPort, mux))
Lassen Sie uns den restlichen Code hinzufügen. Lokalisieren Sie zunächst die folgende Zeile, und heben Sie die Auskommentierung auf:
// mux.HandleFunc("/api/hello", helloHandler)
Fügen Sie zwischen den Importanweisungen und der
main()
-Funktion den folgenden Code ein:func helloHandler(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") if r.Method == "GET" { w.Write([]byte("hello world")) } else { body, _ := ioutil.ReadAll(r.Body) w.Write(body) } }
Die
helloHandler()
-Funktion legt den Inhaltstyp aufapplication/json
fest. Sie antwortet entweder mit „Hallo Welt“ oder mit dem gesendeten Text, falls vorhanden.
Ausführen der App
Sie sind mit der Erstellung des Codes an dieser Stelle fertig, müssen aber noch einige Konfigurationen vornehmen, damit dieses Szenario funktioniert. Sie müssen angeben, wo sich Ihre ausführbare Datei befindet, sodass der Functions-Host sie finden kann. Sie müssen auch das Routing konfigurieren und angeben, dass diese App mit HTTP-Triggern und keinen anderen Bindungstypen arbeitet.
Führen Sie über ein Terminal
go build server.go
im Projektstammverzeichnis aus:go build server.go
In diesem Schritt wird eine ausführbare Datei namens server unter macOS und Linux oder server.exe unter einem Windows-Betriebssystem erstellt.
Öffnen Sie die Datei host.json, und suchen Sie das
defaultExecutablePath
-Element innerhalb des ElementscustomHandler
. Geben Sie./server
unter macOS und Linux oder.\server.exe
unter einem Windows-Betriebssystem an.Fügen Sie unter dem
customHandler
-Element dasenableForwardingHttpRequest
-Element hinzu, und weisen Sie ihm den Werttrue
zu. IhrcustomHandler
-Element sollte jetzt wie folgt aussehen:"customHandler": { "description": { "defaultExecutablePath": "./server", "workingDirectory": "", "arguments": [] }, "enableForwardingHttpRequest" : true }
Führen Sie über ein Terminal
func start
im Projektstammverzeichnis aus. Dadurch wird Ihre Functions-App gestartet.func start
Am Ende der Ausgabe wird eine Ausgabe ähnlich der folgenden angezeigt:
Functions: hello: [GET,POST] http://localhost:7071/api/hello
Navigieren Sie in einem Browser zu
http://localhost:7071/api/hello
. Die folgende Ausgabe sollte angezeigt werden: „Hello World“.
Herzlichen Glückwunsch! Sie haben eine serverlose App in Go entwickelt.