2 回答

TA貢獻(xiàn)1858條經(jīng)驗(yàn) 獲得超8個(gè)贊
notorious.no 提供的解決方案也非常適合給定的要求。我還遇到了另一個(gè)使用 PathPrefix 并解決相同問題的解決方案,并希望獲得相同的建議。
// create a serve mux
sm := mux.NewRouter()
// register handlers
postR := sm.Methods(http.MethodPost).Subrouter()
postR.HandleFunc("/signup", uh.Signup)
postR.HandleFunc("/login", uh.Login)
postR.Use(uh.MiddlewareValidateUser)
refToken := sm.PathPrefix("/refresh-token").Subrouter()
refToken.HandleFunc("", uh.RefreshToken)
refToken.Use(uh.MiddlewareValidateRefreshToken)
getR := sm.Methods(http.MethodGet).Subrouter()
getR.HandleFunc("/greet", uh.Greet)
getR.Use(uh.MiddlewareValidateAccessToken)
使用參考來到這個(gè)解決方案:https ://github.com/gorilla/mux/issues/360

TA貢獻(xiàn)1862條經(jīng)驗(yàn) 獲得超7個(gè)贊
我有一個(gè)類似的用例,這是我如何解決它的一個(gè)例子:
package main
import (
"log"
"net/http"
"time"
)
import (
"github.com/gorilla/mux"
)
// Adapter is an alias so I dont have to type so much.
type Adapter func(http.Handler) http.Handler
// Adapt takes Handler funcs and chains them to the main handler.
func Adapt(handler http.Handler, adapters ...Adapter) http.Handler {
// The loop is reversed so the adapters/middleware gets executed in the same
// order as provided in the array.
for i := len(adapters); i > 0; i-- {
handler = adapters[i-1](handler)
}
return handler
}
// RefreshToken is the main handler.
func RefreshToken(res http.ResponseWriter, req *http.Request) {
res.Write([]byte("hello world"))
}
// ValidateRefreshToken is the middleware.
func ValidateRefreshToken(hKey string) Adapter {
return func(next http.Handler) http.Handler {
return http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) {
// Check if a header key exists and has a value
if value := req.Header.Get(hKey); value == "" {
res.WriteHeader(http.StatusForbidden)
res.Write([]byte("invalid request token"))
return
}
// Serve the next handler
next.ServeHTTP(res, req)
})
}
}
// MethodLogger logs the method of the request.
func MethodLogger() Adapter {
return func(next http.Handler) http.Handler {
return http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) {
log.Printf("method=%s uri=%s\n", req.Method, req.RequestURI)
next.ServeHTTP(res, req)
})
}
}
func main() {
sm := mux.NewRouter()
getR := sm.Methods(http.MethodGet).Subrouter()
getR.HandleFunc("/refresh-token", Adapt(
http.HandlerFunc(RefreshToken),
MethodLogger(),
ValidateRefreshToken("Vikee-Request-Token"),
).ServeHTTP)
srv := &http.Server{
Handler: sm,
Addr: "localhost:8888",
WriteTimeout: 30 * time.Second,
ReadTimeout: 30 * time.Second,
}
log.Fatalln(srv.ListenAndServe())
}
該Adapt函數(shù)允許您將多個(gè)處理程序鏈接在一起。我已經(jīng)演示了 2 個(gè)中間件函數(shù)(ValidateRefreshToken和MethodLogger)。中間件基本上是閉包。您可以將此方法與任何接受http.Handler諸如mux和的框架一起使用chi。
- 2 回答
- 0 關(guān)注
- 124 瀏覽
添加回答
舉報(bào)