0Pricing
Go Academy · Lección

Fundamentos de la cadena de middleware HTTP

Envoltorio de http.Handler y encadenamiento con next

Fundamentos de la cadena de middleware HTTP es una lección gratuita de Go Academy en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Go Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Go Academy incluye 4 lecciones en total.

Middleware en net/http

En la biblioteca estándar de Go, el middleware es una función que acepta un http.Handler y devuelve un nuevo http.Handler con comportamiento adicional alrededor del original.

type Middleware func(http.Handler) http.Handler

Middleware básico

El HandlerFunc interno envuelve el controlador original con lógica previa y posterior:

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

Aplicación del middleware

Envuelva los controladores antes de registrarlos en el mux:

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

Asistente para encadenar middleware

Una función de cadena aplica varios middlewares en un orden legible, de izquierda a derecha:

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)

Contexto en el middleware

Asocie valores específicos de la solicitud creando un contexto derivado y envolviendo la solicitud:

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

Envoltorio del escritor de respuestas

Capture el código de estado escrito por un controlador envolviendo el ResponseWriter:

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

Middleware de recuperación de panics

Recupérese de los panics para evitar que el servidor se bloquee:

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

El orden es importante

El middleware se ejecuta en el orden en que envuelve al controlador. Recovery debe ser el más externo (debe envolverlo todo). Auth debe ejecutarse antes de la lógica de negocio. Logging suele ser el más externo después de Recovery.

Compatibilidad con enrutadores de terceros

Como el middleware sigue la firma estándar func(http.Handler) http.Handler, es compatible con chi, gorilla/mux y cualquier enrutador que acepte http.Handler.

Global frente a específico de una ruta

Aplique el middleware globalmente a todo el mux o envuelva controladores individuales para un comportamiento específico de cada ruta. Los subenrutadores de chi facilitan la aplicación de middleware a nivel de grupo.

Pruebas del middleware

Use httptest.NewRecorder y httptest.NewRequest para probar el middleware de forma aislada, sin iniciar un servidor real.

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

Comprobación rápida

¿Cuál es la firma estándar del middleware de net/http?

Recapitulación: cadena de middleware

Puntos clave:

  • func(http.Handler) http.Handler es la firma estándar
  • Use un asistente Chain para evitar anidamientos profundos
  • Use r.WithContext(ctx) para asociar valores y capture el writer para registrar el estado
  • Recovery en la capa más externa; Auth antes de la lógica de negocio; Logging después de Recovery

Preguntas frecuentes

¿La lección «Fundamentos de la cadena de middleware HTTP» es gratis?

Sí — el texto completo de «Fundamentos de la cadena de middleware HTTP» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Go Academy, actualiza a CoddyKit PRO. El curso de Go Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Fundamentos de la cadena de middleware HTTP»?

Envoltorio de http.Handler y encadenamiento con next Practicas Go Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Go Academy?

No se requiere experiencia previa. Go Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.

¿Cuánto tiempo toma la lección «Fundamentos de la cadena de middleware HTTP»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Go Academy?

Sí. Cada lección de Go Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Fundamentos de la cadena de middleware HTTP
  2. Middleware de registro e identificador de solicitud
  3. Middleware de autenticación y limitación de tasa
  4. Middleware de CORS y recuperación ante panics
← Volver a Go Academy