Gorilla mux定制中间件

时间:2014-10-05 16:05:26

标签: go gorilla

我正在使用gorilla mux进行管理路由。我缺少的是在每个请求之间集成中间件。

例如

package main

import (
    "fmt"
    "github.com/gorilla/mux"
    "log"
    "net/http"
    "strconv"
)

func HomeHandler(response http.ResponseWriter, request *http.Request) {

    fmt.Fprintf(response, "Hello home")
}

func main() {

    port := 3000
    portstring := strconv.Itoa(port)

    r := mux.NewRouter()
    r.HandleFunc("/", HomeHandler)
    http.Handle("/", r)

    log.Print("Listening on port " + portstring + " ... ")
    err := http.ListenAndServe(":"+portstring, nil)
    if err != nil {
        log.Fatal("ListenAndServe error: ", err)
    }
}

每个传入的请求都应该通过中间件。我怎样才能在这里集成一个midleware?

更新

我会将它与大猩猩/会话结合使用,他们会说:

  

重要说明:如果您不使用gorilla / mux,则需要包装   具有context.ClearHandler的处理程序,否则你会泄漏内存!一个   这样做的简单方法是在调用时包装顶级多路复用器   http.ListenAndServe:

如何防止出现这种情况?

5 个答案:

答案 0 :(得分:59)

只需创建一个包装器,在Go:

中相当容易
func HomeHandler(response http.ResponseWriter, request *http.Request) {

    fmt.Fprintf(response, "Hello home")
}

func Middleware(h http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        log.Println("middleware", r.URL)
        h.ServeHTTP(w, r)
    })
}
func main() {
    r := mux.NewRouter()
    r.HandleFunc("/", HomeHandler)
    http.Handle("/", Middleware(r))
}

答案 1 :(得分:6)

我不确定为什么@OneOfOne选择将路由器链接到中间件,我认为这是更好的方法:

func main() {
    r.Handle("/",Middleware(http.HandlerFunc(homeHandler)))
    http.Handle("/", r)
}

func Middleware(h http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    h.ServeHTTP(w, r)
})}

答案 2 :(得分:3)

如果要将中间件链应用于路由器或子路由器的所有路由,可以使用Gorilla mux的分支https://github.com/bezrukovspb/mux

subRouter := router.PathPrefix("/use-a-b").Subrouter().Use(middlewareA, middlewareB)
subRouter.Path("/hello").HandlerFunc(requestHandlerFunc)

答案 3 :(得分:2)

func Middleware(h http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        // do stuff
        h.ServeHTTP(w, r)
    })
}

func main () {
    router := mux.NewRouter()
    router.Use(Middleware)
    // Add more middleware if you need
    // router.Use(Middleware2) 
    // router.Use(Middleware3)

    _ = http.ListenAndServe(":80", router)
}

答案 4 :(得分:1)

您可能会考虑使用negroni等中间件包。