首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在中间件中获取路由参数?

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

Stack Overflow用户
提问于 2017-05-15 12:22:03
回答 1查看 1.3K关注 0票数 2

我正在使用大猩猩穆克斯作为请求路由。我编写了一个基本的中间件,我希望将user变量添加到上下文中,以便在处理程序中达到目的。但是,我不知道如何在中间件中获得路由参数:

代码语言:javascript
运行
复制
router := mux.NewRouter().StrictSlash(true)
router.HandleFunc("/{username}/accounts", AccountListHandler)

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

中间件代码:

代码语言:javascript
运行
复制
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参数。我该怎么做?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-15 13:33:41

以设置它的方式,您将无法访问username。原因是您的AuthMiddleware是在之前执行的,路径参数是由router提取的,因为它是包装在中间件(AuthMiddleware(router))中的。

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

代码语言:javascript
运行
复制
router := mux.NewRouter().StrictSlash(true)
router.HandleFunc("/{username}/accounts", AuthMiddleware(AccountListHandler))

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

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

代码语言:javascript
运行
复制
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))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43979440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档