Construyendo aplicaciones Web con Go

Semiware

Si tienes algo de código que necesitas ejecutar en cada petición, independientemente de la ruta que eventualmente se acabará invocando, necesitas alguna manera de apilar http.Handlers uno encima del otro y ejecutarlos en secuencia. Este problema se resuelve elegantemente a través de paquetes de semiware. Negroni es un paquete de semiware popular que facilita la construcción y apilamiento de semiware, manteniendo intacta la naturaleza composible del ecosistema web de Go.

Negroni viene con algún semiware predeterminado tal como el registro cronológico de eventos, recuperación de errores, y la porción de fichero estático. Así que fuera de la caja Negroni te proporcionará un gran valor sin gastar demasiado.

El siguiente ejemplo muestra cómo utilizar una pila Negroni con su semiware integrado y cómo crear tu propio semiware personalizado.

package main

import (
    "log"
    "net/http"

    "github.com/codegangsta/negroni"
)

func main() {
    // Semiware pila
    n := negroni.New(
        negroni.NewRecovery(),
        negroni.HandlerFunc(MiSemiware)
        negroni.NewLogger(),
        negroni.NewStatic(http.Dir("publico"))
    )

    n.Run(":8080")
}

func MiSemiware(rw http.ResponseWriter, r *http.Request, siguiente http.HandlerFunc) {
    log.Println("Inicio de sesión en la ruta...")

    if r.URL.Query().Get("password") == "secreto123" {
        siguiente(rw, r)
    } else {
        http.Error(rw, "no autorizado", 401)
    }

    log.Println("De vuelta inicia sesión en la ruta..." )
}

Ejercicios

  1. Piensa en algunas buenas ideas de semiware y trata de implementarlas utilizando Negroni.
  2. Explora cómo puedes mejorar Negroni con github.com/gorilla/mux utilizando la interfaz http.Handler.
  3. Juega creando pilas Negroni para ciertos grupos de rutas en lugar de crear la pila de toda la aplicación.