我正在使用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
参数。我怎么能这样做?
答案 0 :(得分:2)
您设置它的方式将无法访问 您需要使用中间件来包装处理程序,然后将其注册到路由器,如下所示: 如果您有许多处理程序要用中间件包装而不必重复太多,那么可以编写一个简单的循环:username
。这样做的原因是AuthMiddleware
在router
提取路径参数之前执行,因为它包含在您的中间件(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))