Einführung in HTTP-Handler mit Go

Go (bzw. Golang) bringt von Haus aus alles mit, um schlanke und performante Webserver aufzubauen. HTTP-Handler spielen dabei eine zentrale Rolle – sie verarbeiten Anfragen, liefern Antworten und lassen sich unkompliziert kombinieren, erweitern und testen.

Was ist ein HTTP-Handler?

Ein HTTP-Handler ist im Grunde eine Funktion, die das Interface http.Handler implementiert – konkret also die Methode ServeHTTP(w http.ResponseWriter, r *http.Request). Darüber lässt sich direkt auf die eingehende Anfrage reagieren und eine Antwort schreiben.


func helloHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hallo, Welt!")
}
  

Dieser Handler antwortet einfach mit „Hallo, Welt!“ – minimal, aber funktional.

Routing mit dem http.ServeMux

Routen lassen sich über den Standard-Multiplexer http.ServeMux registrieren. So werden unterschiedliche Pfade an passende Handler-Funktionen delegiert.


mux := http.NewServeMux()
mux.HandleFunc("/hello", helloHandler)
http.ListenAndServe(":8080", mux)
  

In diesem Beispiel lauscht der Server auf Port 8080 und reagiert auf /hello mit dem oben definierten Handler.

Middleware: Logik vor und nach dem Handler

Middleware ist in Go ein Pattern, kein Feature. Damit lassen sich z. B. Logging, Authentifizierung oder Caching kapseln und in den Request-Flow einbauen. In der Java Welt nennt sich das dann ServletFilter oder HttpInterceptor.


func loggingMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        log.Printf("Anfrage: %s %s", r.Method, r.URL.Path)
        next.ServeHTTP(w, r)
    })
}
  

Dieses Meisterwerk loggt somit jede Anfrage, aber die Grundidee wird somit vermittelt - hoffe ich. Eingebunden könnte das so aussehen

func main() {
	mux := http.NewServeMux()
	mux.Handle("/hello", loggingMiddleware(http.HandlerFunc(helloHandler)))
	http.ListenAndServe(":8080", mux)
}

Fazit

Go macht den Einstieg in Webentwicklung angenehm und pragmatisch. Mit HTTP-Handlern, dem integrierten Router und der Middleware-Struktur lassen sich schlanke, wartbare APIs und Services ohne externe Abhängigkeiten. Wer die Basics verstanden hat, kann das Ganze schnell auf Produktionsniveau skalieren – ganz im Sinne der gesamten Sprache.

Ausserdem wäre man mit der Nutzung der Standard API auch im Reddit r/golang ein gern gesehener Nutzer. ;)

Nachtrag

Ich habe bewusst auf die Fehlerbehandlung in den Beispielen zwecks besserer lesbarkeit verzichtet. Der Compiler wird euch sicherlich darauf aufmerksam machen, falls ihr den Code einfach kopiert. Ignoriert Eure errors nicht!