Wzorzec middleware
Łączenie handlerów na potrzeby logowania i uwierzytelniania
Wzorzec middleware to bezpłatna lekcja Go Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Go Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Go Academy zawiera 4 lekcji w sumie.
Czym jest middleware?
Middleware to funkcja opakowująca http.Handler w celu dodania przekrojowych funkcji, takich jak logowanie, uwierzytelnianie i odzyskiwanie po błędach, bez modyfikowania logiki biznesowej handlera.
Sygnatura middleware
Middleware to funkcja, która przyjmuje http.Handler i zwraca http.Handler:
type Middleware func(http.Handler) http.HandlerProsty middleware logujący
Rejestruj każde żądanie przed uruchomieniem handlera i po jego zakończeniu:
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("done %s", r.URL.Path)
})
}Łączenie middleware
Zastosuj wiele warstw middleware, zagnieżdżając je:
handler := Logger(Auth(RateLimit(myHandler)))
http.ListenAndServe(":8080", handler)Pomocnicza funkcja łańcucha middleware
Zbuduj funkcję łańcucha, aby stosować middleware w odpowiedniej kolejności bez głębokiego zagnieżdżania:
func Chain(h http.Handler, m ...Middleware) http.Handler {
for i := len(m)-1; i >= 0; i-- {
h = m[i](h)
}
return h
}
// Usage: Chain(myHandler, Logger, Auth, RateLimit)Middleware uwierzytelniania
Sprawdź uwierzytelnienie przed wywołaniem kolejnego handlera. Jeśli tokenu brakuje albo jest nieprawidłowy, od razu zwróć status 401.
func Auth(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
token := r.Header.Get("Authorization")
if !isValid(token) {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
next.ServeHTTP(w, r)
})
}Middleware odzyskiwania po panice
Przechwytuj paniki z handlerów, aby serwer nie uległ awarii:
func Recovery(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
defer func() {
if err := recover(); err != nil {
log.Printf("panic: %v", err)
http.Error(w, "Internal Server Error", 500)
}
}()
next.ServeHTTP(w, r)
})
}Przekazywanie danych za pomocą context
Middleware może dołączać dane do kontekstu żądania, aby były dostępne dla kolejnych handlerów:
ctx := context.WithValue(r.Context(), userKey, user)
next.ServeHTTP(w, r.WithContext(ctx))Wrapper odpowiedzi
Przechwyć kod statusu zapisany przez handler, opakowując ResponseWriter:
type statusRecorder struct {
http.ResponseWriter
status int
}
func (r *statusRecorder) WriteHeader(code int) {
r.status = code
r.ResponseWriter.WriteHeader(code)
}Kolejność ma znaczenie
Middleware wykonuje się w kolejności, w jakiej opakowuje handler. Uwierzytelnianie powinno działać przed ograniczaniem liczby żądań, a odzyskiwanie po panice powinno znajdować się na zewnątrz, aby przechwytywać paniki z innych middleware.
Middleware dla trasy a middleware globalne
Zastosuj globalne middleware (logowanie, odzyskiwanie po błędach) do całego muxa. Middleware dotyczące konkretnych tras (uwierzytelnianie, ograniczanie liczby żądań) stosuj do wybranych grup tras za pomocą podrutera lub wrappera handlera.
Szybkie sprawdzenie
Jaka jest prawidłowa sygnatura middleware HTTP w Go?
Podsumowanie: wzorzec middleware
Najważniejsze informacje:
- Middleware: func(http.Handler) http.Handler
- Łącz middleware przez zagnieżdżanie; dla przejrzystości używaj funkcji Chain
- Odzyskiwanie po panice na zewnątrz; uwierzytelnianie przed logiką biznesową
- Przekazuj dane do kolejnych handlerów za pośrednictwem context
Często zadawane pytania
Czy lekcja „Wzorzec middleware” jest bezpłatna?
Tak — pełny tekst „Wzorzec middleware” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Go Academy, przejdź na CoddyKit PRO. Kurs Go Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Wzorzec middleware”?
Łączenie handlerów na potrzeby logowania i uwierzytelniania Ćwiczysz Go Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Go Academy?
Nie wymagamy żadnego doświadczenia. Go Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „Wzorzec middleware”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Go Academy?
Tak. Każda lekcja Go Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Tworzenie serwera HTTP
- Routing i parametry ścieżek
- Wzorzec middleware
- Kontrolowane zamykanie