Web-App

Abgeschlossen

Um einen benutzerdefinierten Handler zu verwenden, müssen Sie eine Webanwendung erstellen. Nachdem Sie Ihre Anwendung geschrieben und kompiliert haben, müssen Sie den Azure Functions-Host konfigurieren, damit er weiß, wie sie verwendet werden soll. Wir werden später mehr darüber erfahren. Wie erstellen Sie zunächst eine Webanwendung in Go?

Erstellen einer REST-API in Go

Wenn Sie eine REST-API mithilfe von Go erstellen möchten, müssen Sie ein paar Fakten kennen:

  • Importbibliotheken. Sie verwenden die Bibliotheken fmt, log und net/http. Diese Bibliotheken helfen Ihnen bei der Verwaltung von Routen, der Bearbeitung eingehender Anforderungen und bei der Protokollierung. Verwenden Sie die folgende Importanweisung:

    import (
       "fmt",
       "log",
       "net/http"
    )    
    
  • Einrichten des Routings. REST-APIs bestehen aus logischen Unterteilungen, die Routen genannt werden. Routen sind Adressen, die auf ein bestimmtes Problem in der App reagieren. Rufen Sie zum Einrichten einer Route die HandleFunc()-Methode für die http-Instanz auf, und definieren Sie die Route, um auf Anforderungen zu reagieren:

    http.HandleFunc("/", handleRoute)   
    

    In diesem Fall müssen Sie eine handleRoute-Funktion erstellen, um eingehende Anforderungen mit der Route "/" abzugleichen.

  • Verwalten von Anforderungen. Sie müssen eingehende Anforderungen verwalten und Aspekte wie Router- oder Abfrageparameter oder den Textkörper einer Nachricht lesen. Anschließend müssen Sie eine Antwort erstellen. Eine Funktion, die eine Anforderung verarbeitet, kann wie folgt aussehen:

    func handleRequest(w: http:ResponseWriter, r: http.Request) {
        fmt.Fprintf(w, "My first REST API") 
    }
    

    Der Code sendet den Text „My first REST API“ (Meine erste REST-API) zurück an einen aufrufenden Client. Die Fprintf()-Methode verwendet zwei Argumente: den Antwortdatenstrom und die Zeichenfolge, die zurück gesendet werden soll.

  • Erstellen des Servers. Sie müssen den Server starten, um auf Anforderungen lauschen zu können. Sie müssen auch einen Teil angeben, an den Anforderungen gesendet werden können. Der folgende Code zeigt, wie Sie den Server erstellen:

    http.ListenAndServe(":3000", nil)
    

    Der Server ist jetzt aktiviert und kann auf Anforderungen an Port 3000 lauschen.

Erstellen einer Azure Functions-App

Bevor Sie eine Azure Functions-App entwickeln, empfehlen wir Folgendes:

Erstellen eines Gerüsts für eine Functions-App mithilfe von Visual Studio Code

Nachdem Sie alle erforderlichen Abhängigkeiten auf Ihrem System installiert haben, besteht der nächste Schritt darin, ein Gerüst für eine Anwendung zu erstellen. Wenn Sie hinsichtlich der Runtime befragt werden, wählen Sie Benutzerdefinierter Handler aus.

Jetzt haben Sie sichergestellt, dass die richtigen Dateien generiert werden. Wenn Sie ein Projekt auf diese Weise erstellen, müssen Sie einen Triggertyp für Ihre erste Funktion auswählen. Benutzerdefinierte Handler funktionieren mit allen üblichen Triggern und Bindungen.

Nachdem Sie das Projekt generiert haben, sollten Sie über eine App mit den folgenden Dateien verfügen:

  • host.json
  • local.setting.json
  • proxies.json
  • function.json

Die Datei function.json befindet sich in einem Verzeichnis, dessen Name dem Namen Ihrer ersten Funktion entspricht. Sie verwenden diese Datei, um Ihre Funktion zu konfigurieren.

Konfigurieren des Projekts

Damit Ihre App mit HTTP-Primitiven arbeiten kann, müssen Sie ein paar Punkte konfigurieren:

  • Lauschen an einem benutzerdefinierten Handlerport. Ihre App muss an einem bestimmten Port lauschen. Die Variable FUNCTIONS_CUSTOMHANDLER_PORT enthält den benötigten Wert. Sie können den Portwert mit dem folgenden Code suchen:

    customHandlerPort, exists := os.LookupEnv("FUNCTIONS_CUSTOMHANDLER_PORT")
    
  • Konfigurieren des Standardpfads der ausführbaren Datei. Da Sie eine ausführbare Datei erstellen, müssen Sie Ihrem Functions-App-Projekt mitteilen, wo sie sich befindet.

    Suchen Sie die Datei function.json im Projektstammverzeichnis. Geben Sie im Abschnitt customHandler entsprechend defaultExecutablePath an. Hier sehen Sie ein Beispiel, wie das aussehen kann:

    "customHandler": {
       "defaultExecutablePath": "mygoapp.exe"
    }
    
  • Aktivieren der Anforderungsweiterleitung. Wenn eine Funktion vorliegt, die einen HTTP-Trigger verwendet, möchten Sie die App etwas anders konfigurieren, als wenn Sie es mit einer anderen Art von Trigger zu tun hätten (z. B. einem Warteschlangentrigger).

    Aktivieren Sie eine Eigenschaft namens enableForwardingHttpRequest. Wenn diese Eigenschaft aktiviert ist, ändert sich das Verhalten bei der Behandlung der Anforderung wie folgt:

    • Kopie der ursprünglichen Anforderung. Die Anforderungsnutzdaten des benutzerdefinierten Handlers sind nicht in der HTTP-Anforderung enthalten. Stattdessen ruft der Functions-Host den Handler mit einer Kopie der ursprünglichen HTTP-Anforderung auf.

    • Gleicher Pfad wie in der ursprünglichen Anforderung. Der Functions-Host ruft den Handler mit demselben Pfad wie die ursprüngliche Anforderung auf.

      Wenn Sie eine Route und einen Routenhandler definieren, müssen Sie genau darauf achten, wie Sie das Routing einrichten. Angenommen, Sie haben die folgende Projektgliederung:

      hello/
        function.json   
      

      Die Dateien in der Gliederung werden standardmäßig einer Route /api/hello zugeordnet. In Ihrem Code zum Einrichten der Route müssen Sie die vollständige Route angeben:

      mux.HandleFunc("/api/hello", helloHandler)
      

      Wenn Sie diese Einstellung nicht aktiviert hätten, wäre es für andere Arten von Triggern und Bindungen ausreichend gewesen, den Routercode "/hello" anzugeben.

    • Kopie der Antwort des Handlers. Der Functions-Host gibt eine Kopie der HTTP-Antwort des Handlers als Antwort auf die ursprüngliche Anforderung zurück.

Im vorherigen Beispiel lautet die ausführbare Datei mygoapp.exe. Im Beispiel wird davon ausgegangen, dass Sie die ausführbare Datei aus einer Datei namens mygoapp.go erstellen, aber Sie können Ihrer Go-Datei einen beliebigen Namen zuweisen. Unter Linux oder macOS hat die ausführbare Datei keine Erweiterung.

Erstellen der App

Das Erstellen der Web-App unterscheidet sich zu diesem Zeitpunkt nicht wesentlich von der Erstellung einer Web-App mit Go. Solange Sie die im vorherigen Abschnitt beschriebene Konfiguration abgeschlossen haben, sind Sie startklar.

Jetzt müssen Sie die folgenden Schritte ausführen:

  1. Lesen Sie den Port.
  2. Instanziieren Sie eine HTTP-Serverinstanz.
  3. Definieren Sie Routen und Routenhandler.
  4. Starten Sie das Lauschen am Port.
customHandlerPort, exists := os.LookupEnv("FUNCTIONS_CUSTOMHANDLER_PORT")
if !exists {
   customHandlerPort = "8080"
} // 1)
mux := http.NewServeMux() // 2)
mux.HandleFunc("/order", orderHandler) // 3)
fmt.Println("Go server Listening on: ", customHandlerPort)
log.Fatal(http.ListenAndServe(":"+customHandlerPort, mux)) // 4)