如何将参数传递给 MiddlewareFunc?
How to pass a parameter to a MiddlewareFunc?
我正在做一个小演示,试图解释基本 HTTP 处理程序的工作原理,我发现了以下示例:
package main
func router() *mux.Router {
router := mux.NewRouter()
auth := router.PathPrefix("/auth").Subrouter()
auth.Use(auth.ValidateToken)
auth.HandleFunc("/api", middleware.ApiHandler).Methods("GET")
return router
}
func main() {
r := router()
http.ListenAndServe(":8080", r)
}
package auth
func ValidateToken(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
var header = r.Header.Get("secret-access-token")
json.NewEncoder(w).Encode(r)
header = strings.TrimSpace(header)
if header == "" {
w.WriteHeader(http.StatusForbidden)
json.NewEncoder(w).Encode("Missing auth token")
return
}
if header != "SecretValue" {
w.WriteHeader(http.StatusForbidden)
json.NewEncoder(w).Encode("Auth token is invalid")
return
}
json.NewEncoder(w).Encode(fmt.Sprintf("Token found. Value %s", header))
next.ServeHTTP(w, r)
})
}
package middleware
func ApiHandler(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode("SUCCESS!")
return
}
一切都可以理解,但是 pop-out 我想到了两个问题:
- 为什么不需要在这一行中发送参数:
secure.Use(auth.ValidateToken)
?
- 如果我想向这个
auth.ValidateToken
函数发送一个额外的参数,(例如,一个字符串,应该比较这个 header 而不是 "SecretValue"
),如何这要做吗?
提前致谢,我对使用 golang 有点陌生,想了解更多。
auth.Use
将函数作为参数,而 auth.ValidateToken
是您传递的函数。如果您想向 auth.ValidateToken
发送一个参数,您可以编写一个接受该参数的函数,然后 returns 一个中间件函数,如下所示:
func GetValidateTokenFunc(headerName string) func(http.Handler) http.Handler {
return func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
var header = r.Header.Get(headerName)
...
}
}
}
那么你可以这样做:
auth.Use(auth.GetValidateTokenFunc("headerName"))
我正在做一个小演示,试图解释基本 HTTP 处理程序的工作原理,我发现了以下示例:
package main
func router() *mux.Router {
router := mux.NewRouter()
auth := router.PathPrefix("/auth").Subrouter()
auth.Use(auth.ValidateToken)
auth.HandleFunc("/api", middleware.ApiHandler).Methods("GET")
return router
}
func main() {
r := router()
http.ListenAndServe(":8080", r)
}
package auth
func ValidateToken(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
var header = r.Header.Get("secret-access-token")
json.NewEncoder(w).Encode(r)
header = strings.TrimSpace(header)
if header == "" {
w.WriteHeader(http.StatusForbidden)
json.NewEncoder(w).Encode("Missing auth token")
return
}
if header != "SecretValue" {
w.WriteHeader(http.StatusForbidden)
json.NewEncoder(w).Encode("Auth token is invalid")
return
}
json.NewEncoder(w).Encode(fmt.Sprintf("Token found. Value %s", header))
next.ServeHTTP(w, r)
})
}
package middleware
func ApiHandler(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode("SUCCESS!")
return
}
一切都可以理解,但是 pop-out 我想到了两个问题:
- 为什么不需要在这一行中发送参数:
secure.Use(auth.ValidateToken)
? - 如果我想向这个
auth.ValidateToken
函数发送一个额外的参数,(例如,一个字符串,应该比较这个 header 而不是"SecretValue"
),如何这要做吗?
提前致谢,我对使用 golang 有点陌生,想了解更多。
auth.Use
将函数作为参数,而 auth.ValidateToken
是您传递的函数。如果您想向 auth.ValidateToken
发送一个参数,您可以编写一个接受该参数的函数,然后 returns 一个中间件函数,如下所示:
func GetValidateTokenFunc(headerName string) func(http.Handler) http.Handler {
return func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
var header = r.Header.Get(headerName)
...
}
}
}
那么你可以这样做:
auth.Use(auth.GetValidateTokenFunc("headerName"))