如何在中间件中获取路由参数?

时间:2017-05-15 12:22:03

标签: go gorilla

我正在使用gorilla mux进行请求路由。 我编写了一个基本的中间件,我想将user变量添加到上下文中以便在处理程序中使用。但我无法找到如何在中间件中获取路由参数:

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

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

中间件代码:

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

我希望在中间件中达到username参数。我怎么能这样做?

1 个答案:

答案 0 :(得分:2)

您设置它的方式将无法访问username。这样做的原因是AuthMiddlewarerouter提取路径参数之前执行,因为它包含在您的中间件(AuthMiddleware(router))中。< / p>

您需要使用中间件来包装处理程序,然后将其注册到路由器,如下所示:

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

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

如果您有许多处理程序要用中间件包装而不必重复太多,那么可以编写一个简单的循环:

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