Übung: Verwenden eines benutzerdefinierten Handlers zum Erstellen einer App

Abgeschlossen

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.

  1. Wählen Sie Ansicht>Befehlspalette aus.
  2. Klicken Sie auf Azure Functions: Create New Project (Azure Functions: Neues Projekt erstellen).
  3. Wählen Sie einen Ordner aus, in der Regel Ihren aktuellen Ordner.
  4. Wählen Sie unter Sprache auswählen die Option Benutzerdefinierter Handler.
  5. Wählen Sie in Vorlage für Ihre erste Funktion auswählen die Option HttpTrigger aus.
  6. Geben Sie der App einen Namen, z. B. hello.
  7. 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.

  1. Erstellen Sie im Projektstamm eine Datei namens server.go.

  2. 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.

  3. 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 Umgebungsvariablen FUNCTIONS_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))
    
  4. 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)
    
  5. 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 auf application/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.

  1. 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.

  2. Öffnen Sie die Datei host.json, und suchen Sie das defaultExecutablePath-Element innerhalb des Elements customHandler. Geben Sie ./server unter macOS und Linux oder .\server.exe unter einem Windows-Betriebssystem an.

  3. Fügen Sie unter dem customHandler-Element das enableForwardingHttpRequest-Element hinzu, und weisen Sie ihm den Wert true zu. Ihr customHandler-Element sollte jetzt wie folgt aussehen:

    "customHandler": {
     "description": {
       "defaultExecutablePath": "./server",
       "workingDirectory": "",
       "arguments": []
     },
     "enableForwardingHttpRequest" : true
    }
    
  4. 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
    
  5. 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.