Erstellen eines HTTP-Servers in Golang von Grund auf
Golang wird bereits mit einem robusten, leistungsstarken und produktionsreifen HTTP-Server ausgeliefert. Außerdem ist er sehr einfach zu bedienen und dennoch vielseitig und bis ins kleinste Detail konfigurierbar.
Das Paket http enthält ein Objekt Server mit allem, was wir brauchen. Das absolute Minimum, das zum Starten benötigt wird, sind die Attribute Addr und Handler.
Addr
Addr ist die Adresse, auf der gelauscht werden soll. Es ist ein String in der Form <ip>:<port>. Wenn wir beispielsweise Anfragen von jedem Rechner im Netzwerk auf Port 8080 empfangen möchten, können wir :8080 oder 0.0.0.0:8080 eingeben. Wenn wir entwickeln, könnten wir 127.0.0.1:8080 verwenden, damit nur unser Rechner darauf zugreifen kann (sehr nützlich auf dem Mac, um zu vermeiden, dass ständig die Firewall-Warnung erscheint).
Handler
Handler ist eine Funktion, die jedes Mal aufgerufen wird, wenn der Server eine HTTP-Anfrage erhält. Diese Funktion verfügt über einen ResponseWriter zum Senden unserer Antwort und eine Request zum Lesen der Anfrage des Clients.
Im folgenden Beispiel schreiben wir ein Log mit der HTTP-Methode und der URL und senden dann als Antwort ein "Hello World!!".
package main
import (
"log"
"net/http"
)
func main() {
s := &http.Server{
Addr: ":8080",
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
log.Println(r.Method, r.URL)
w.Write([]byte("Hello World!!"))
}),
}
err := s.ListenAndServe()
if err != nil {
log.Fatal(err)
}
}
Wenn beim Starten des Servers alles gut gegangen ist, stoppt die Ausführung im Aufruf von ListenAndServe, da dieser blockierend ist, und alle eingehenden HTTP-Anfragen werden mit der von uns definierten Handler-Funktion bearbeitet.
In diesem Beispiel geben wir immer dieselbe Antwort zurück, unabhängig von der eingehenden URL.
Weitere Seiten ausliefern
Um weitere Seiten auszuliefern, z. B. die Startseite und die Login-Seite, müssen wir manuell Bedingungen hinzufügen.
s := &http.Server{
Addr: ":8080",
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
log.Println(r.Method, r.URL)
if r.URL.Path == "/" {
w.Write([]byte("<h1>Startseite</h1>"))
return
}
if r.URL.Path == "/login" {
w.Write([]byte("<h1>Login</h1>"))
return
}
// ...
}),
}
Auf diese Weise erhalten wir die Login-Seite beim Aufruf von http://localhost:8080/login und die Startseite unter http://localhost:8080/
Wie du dir bereits denken kannst, ist dieser Code anfällig und schwer wartbar, aber zum Glück gibt es HTTP-Router, auch Mux genannt, die uns den Tag versüßen.
Begleite uns!
Folge dem Projekt auf Discord SeniorGo - Latam.
Tritt dem Projekt auf GitHub bei.
Schau dir das vollständige Video auf YouTube an.
Comentarios