2017-05-15 11 views
1

Ich benutze Gorilla Mux für Request Routing. Ich schrieb eine grundlegende Middleware, die ich user Variable zum Kontext für die Reichweite in Handler hinzufügen möchte. Aber ich chould nicht gefunden, wie kann ich Routenparameter in der Middleware erhalten:Wie erreiche ich Routenparameter in der Middleware?

router := mux.NewRouter().StrictSlash(true) 
router.HandleFunc("/{username}/accounts", AccountListHandler) 

log.Fatal(http.ListenAndServe(":8080", AuthMiddleware(router))) 

Middleware-Code:

func AuthMiddleware(h http.Handler) http.Handler { 
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 
     // params := mux.Vars(r) 
     // fmt.Printf("%v", params["username"]) 
     user := User{Username: "myUsername"} 
     ctx := context.WithValue(r.Context(), "user", user) 
     h.ServeHTTP(w, r.WithContext(ctx)) 
    }) 
} 

I username Paramter in der Middleware erreichen will. Wie kann ich das machen?

Antwort

2

Wie Sie es eingerichtet haben, können Sie nicht auf username zugreifen. Der Grund dafür ist, dass Ihre AuthMiddlewareausgeführt wird, bevor die Pfadparameter von router extrahiert werden, da es in Ihrer Middleware (AuthMiddleware(router)) verpackt ist.

Sie benötigen eine Middleware, um Ihre Handler zu wickeln und es dann mit dem Router registrieren, etwa so:

router := mux.NewRouter().StrictSlash(true) 
router.HandleFunc("/{username}/accounts", AuthMiddleware(AccountListHandler)) 

log.Fatal(http.ListenAndServe(":8080", router)) 

Wenn Sie viele Handler, die Sie mit Ihrer Middleware wickeln möchten, ohne selbst zu viel wiederholen zu müssen Sie können eine einfache Schleife wie folgt schreiben:

var handlers = map[string]http.HandlerFunc{ 
    "/{username}/accounts": AccountListHandler, 
    // ... 
} 

router := mux.NewRouter().StrictSlash(true)  
for pattern, handler := range handlers { 
    router.HandleFunc(pattern, AuthMiddleware(handler)) 
} 

log.Fatal(http.ListenAndServe(":8080", router)) 
Verwandte Themen