【问题标题】:How to reach route parameters in middleware?如何在中间件中获取路由参数?
【发布时间】:2017-05-15 21:33:41
【问题描述】:

我正在使用 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 参数。我该怎么做?

【问题讨论】:

    标签: go gorilla


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-10-27
      • 1970-01-01
      • 2019-01-24
      • 2018-02-10
      • 2017-05-03
      • 2018-01-11
      • 2013-04-30
      • 2021-09-18
      • 2013-12-16
      相关资源
      最近更新 更多