Как передать параметр в MiddlewareFun c? - PullRequest
0 голосов
/ 07 апреля 2020

Я работаю над небольшой демонстрацией, которая пытается объяснить, как работает базовый c обработчик 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 fun c, (например, строка, для которой этот заголовок должен сравниваться вместо "SecretValue"), как это можно сделать?

Спасибо за заранее, я немного новичок в использовании golang и хотел узнать больше.

1 Ответ

1 голос
/ 07 апреля 2020

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