rest - 如何将参数传递给MiddlewareFunc?

标签 rest http go backend mux

我正在做一个小型演示,试图解释基本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
}

一切都是可以理解的,但在我脑海中弹出两个问题:
  • 为什么不需要在此行中发送参数:secure.Use(auth.ValidateToken)
  • 如果我想向此auth.ValidateToken函数发送一个额外的参数(例如,一个字符串,应比较此 header 而不是"SecretValue"的字符串),该怎么做?

  • 在此先感谢您,我是使用golang的新手,并且想了解更多信息。

    最佳答案

    auth.Use以函数作为参数,而auth.ValidateToken是您传递的函数。如果要将参数发送给auth.ValidateToken,则可以编写一个接受该参数并返回中间件函数的函数,如下所示:

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

    关于rest - 如何将参数传递给MiddlewareFunc?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61069784/

    相关文章:

    javascript - $http 响应和 Api 响应的区别 [AngularJs]

    javascript - 从文件 express js 提供 json

    Django 无法找到 post 变量

    rest - PUT 是否应该始终能够插入?

    xml - 使用http在golang中读取FederationMetadata.xml

    go - 将 protobuf 对象哈希为字符串作为 redis 数据库的键

    go - 无法在 Golang 中的 GET 请求的 header 中传递 Bearer token

    jquery - session 变量和 RESTful api

    java - Spring 安全 : How to redirect to a REST url after login

    rest - 在URL中用下划线连接复合键是好/坏设计吗?