0Pricing
Go Academy · Lekcja

Podstawy łańcucha middleware HTTP

Opakowywanie http.Handler i łączenie go za pomocą next

Podstawy łańcucha middleware HTTP to bezpłatna lekcja Go Academy na CoddyKit. To lekcja 1 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.

Middleware w net/http

W bibliotece standardowej Go middleware to funkcja, która przyjmuje http.Handler i zwraca nowy http.Handler z dodatkowym zachowaniem opakowującym oryginał.

type Middleware func(http.Handler) http.Handler

Podstawowe middleware

Wewnętrzny HandlerFunc opakowuje oryginalny program obsługi logiką wykonywaną przed nim i po nim:

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)
    })
}

Stosowanie middleware

Opakowuj programy obsługi przed zarejestrowaniem ich w muxie:

mux := http.NewServeMux()
mux.Handle("/api/", Logger(Auth(apiHandler)))
http.ListenAndServe(":8080", mux)

Pomocnicza funkcja łańcucha middleware

Funkcja łańcucha stosuje wiele middleware w czytelnej kolejności od lewej do prawej:

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)

Kontekst w middleware

Dołączaj wartości związane z żądaniem, tworząc kontekst pochodny i opakowując nim żądanie:

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 zapisu odpowiedzi

Przechwytuj kod statusu zapisany przez program obsługi, opakowując ResponseWriter:

type captureWriter struct {
    http.ResponseWriter
    status int
}
func (cw *captureWriter) WriteHeader(code int) {
    cw.status = code
    cw.ResponseWriter.WriteHeader(code)
}

Middleware odzyskiwania po panice

Odzyskuj działanie po panikach, aby zapobiec awarii serwera:

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)
    })
}

Kolejność ma znaczenie

Middleware jest wykonywane w kolejności, w jakiej opakowuje program obsługi. Recovery powinno znajdować się na zewnętrznej warstwie (opakowywać wszystko). Auth powinno być wykonywane przed logiką biznesową. Logging zwykle znajduje się na zewnętrznej warstwie, za Recovery.

Zgodność z routerami innych firm

Ponieważ middleware korzysta ze standardowej sygnatury func(http.Handler) http.Handler, jest zgodne z chi, gorilla/mux oraz każdym routerem przyjmującym http.Handler.

Globalne a specyficzne dla trasy

Stosuj middleware globalnie do całego muxa albo opakowuj pojedyncze programy obsługi, aby uzyskać zachowanie specyficzne dla trasy. Podroutery chi ułatwiają stosowanie middleware na poziomie grup.

Testowanie middleware

Używaj httptest.NewRecorder i httptest.NewRequest, aby testować middleware w izolacji bez uruchamiania rzeczywistego serwera.

w := httptest.NewRecorder()
r := httptest.NewRequest("GET", "/", nil)
Logger(http.HandlerFunc(noop)).ServeHTTP(w, r)

Szybkie sprawdzenie

Jaka jest standardowa sygnatura middleware w net/http?

Podsumowanie: łańcuch middleware

Najważniejsze informacje:

  • func(http.Handler) http.Handler to standardowa sygnatura
  • Używaj funkcji pomocniczej Chain, aby uniknąć głębokiego zagnieżdżania
  • r.WithContext(ctx) do dołączania wartości; opakuj writer, aby rejestrować status
  • Recovery na zewnętrznej warstwie; Auth przed logiką biznesową; Logging za Recovery

Często zadawane pytania

Czy lekcja „Podstawy łańcucha middleware HTTP” jest bezpłatna?

Tak — pełny tekst „Podstawy łańcucha middleware HTTP” 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 „Podstawy łańcucha middleware HTTP”?

Opakowywanie http.Handler i łączenie go za pomocą next Ć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 1 z 4.

Ile czasu zajmuje lekcja „Podstawy łańcucha middleware HTTP”?

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

  1. Podstawy łańcucha middleware HTTP
  2. Middleware logowania i identyfikatora żądania
  3. Middleware uwierzytelniania i limitowania ruchu
  4. Middleware CORS i odzyskiwania po panic
← Powrót do Go Academy