Grundlagen der HTTP-Middleware-Kette
http.Handler wrappen und mit next verketten
Grundlagen der HTTP-Middleware-Kette ist eine kostenlose Go Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Go Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Go Academy-Kurs umfasst insgesamt 4 Lektionen.
Middleware in net/http
In Gos Standardbibliothek ist Middleware eine Funktion, die einen http.Handler entgegennimmt und einen neuen http.Handler mit zusätzlichem Verhalten zurückgibt, das den ursprünglichen Handler umschließt.
type Middleware func(http.Handler) http.HandlerGrundlegende Middleware
Die innere HandlerFunc umschließt den ursprünglichen Handler mit Logik für die Verarbeitung davor und danach:
func Logger(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
log.Printf("→ %s %s", r.Method, r.URL.Path)
next.ServeHTTP(w, r)
log.Printf("← %s %s done", r.Method, r.URL.Path)
})
}Middleware anwenden
Umschließen Sie Handler, bevor Sie sie beim Multiplexer registrieren:
mux := http.NewServeMux()
mux.Handle("/api/", Logger(Auth(apiHandler)))
http.ListenAndServe(":8080", mux)Hilfsfunktion für Middleware-Ketten
Eine chain-Funktion wendet mehrere Middleware in einer gut lesbaren Reihenfolge von links nach rechts an:
func Chain(h http.Handler, ms ...func(http.Handler) http.Handler) http.Handler {
for i := len(ms)-1; i >= 0; i-- { h = ms[i](h) }
return h
}
// Usage: Chain(handler, Logger, Auth, RateLimit)Kontext in Middleware
Fügen Sie anfragebezogene Werte hinzu, indem Sie einen abgeleiteten Kontext erstellen und die Anfrage damit umschließen:
func RequestID(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
id := uuid.New().String()
ctx := context.WithValue(r.Context(), reqIDKey, id)
w.Header().Set("X-Request-ID", id)
next.ServeHTTP(w, r.WithContext(ctx))
})
}Wrapper für den ResponseWriter
Erfassen Sie den von einem Handler geschriebenen Statuscode, indem Sie den ResponseWriter umschließen:
type captureWriter struct {
http.ResponseWriter
status int
}
func (cw *captureWriter) WriteHeader(code int) {
cw.status = code
cw.ResponseWriter.WriteHeader(code)
}Middleware zur Panic-Wiederherstellung
Fangen Sie Panics ab, um einen Absturz des Servers zu verhindern:
func Recovery(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
defer func() {
if rec := recover(); rec != nil {
http.Error(w, "Internal Server Error", 500)
}
}()
next.ServeHTTP(w, r)
})
}Die Reihenfolge ist entscheidend
Middleware wird in der Reihenfolge ausgeführt, in der sie den Handler umschließt. Recovery sollte die äußerste Schicht sein (also alles umschließen). Auth sollte vor der Geschäftslogik ausgeführt werden. Logging befindet sich üblicherweise nach Recovery in der äußersten Schicht.
Kompatibilität mit Routern von Drittanbietern
Da Middleware der standardmäßigen Signatur func(http.Handler) http.Handler folgt, ist sie mit chi, gorilla/mux und jedem Router kompatibel, der http.Handler akzeptiert.
Global oder routenspezifisch
Wenden Sie Middleware global auf den gesamten Multiplexer an oder umschließen Sie einzelne Handler für routenspezifisches Verhalten. Die Subrouter von chi erleichtern Middleware auf Gruppenebene.
Middleware testen
Verwenden Sie httptest.NewRecorder und httptest.NewRequest, um Middleware isoliert zu testen, ohne einen echten Server zu starten.
w := httptest.NewRecorder()
r := httptest.NewRequest("GET", "/", nil)
Logger(http.HandlerFunc(noop)).ServeHTTP(w, r)Kurze Überprüfung
Wie lautet die standardmäßige Middleware-Signatur von net/http?
Zusammenfassung: Middleware-Kette
Wichtige Punkte:
- func(http.Handler) http.Handler ist die Standardsignatur
- Verwenden Sie eine Chain-Hilfsfunktion, um tiefe Verschachtelungen zu vermeiden
- r.WithContext(ctx) zum Hinzufügen von Werten; ResponseWriter abfangen, um den Status zu protokollieren
- Recovery äußerste Schicht; Auth vor der Geschäftslogik; Logging nach Recovery
Häufig gestellte Fragen
Ist die Lektion „Grundlagen der HTTP-Middleware-Kette“ kostenlos?
Ja — der vollständige Text von „Grundlagen der HTTP-Middleware-Kette“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Go Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Go Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Grundlagen der HTTP-Middleware-Kette“?
http.Handler wrappen und mit next verketten Du übst Go Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Go Academy zu starten?
Keine Vorkenntnisse erforderlich. Go Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.
Wie lange dauert die Lektion „Grundlagen der HTTP-Middleware-Kette“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Go Academy-Lektion Code schreiben und ausführen?
Ja. Jede Go Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Grundlagen der HTTP-Middleware-Kette
- Logging- und Request-ID-Middleware
- Middleware für Authentifizierung und Rate Limiting
- CORS- und Panic-Recovery-Middleware