首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Gorilla mux自定义中间件

Gorilla mux自定义中间件
EN

Stack Overflow用户
提问于 2014-10-06 00:05:26
回答 5查看 35.8K关注 0票数 32

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

例如

代码语言:javascript
复制
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)
    }
}

每个传入的请求都应该通过中间件。我如何在这里集成中间件?

更新

我将把它与gorilla/session结合使用,他们会说:

重要提示:如果你没有使用gorilla/mux,你需要用context.ClearHandler包装你的处理程序,否则你会泄漏内存!一种简单的方法是在调用http.ListenAndServe时包装顶级多路复用器:

我如何防止这种情况发生?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-10-06 00:30:11

只需创建一个包装器,这在Go中相当简单:

代码语言:javascript
复制
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))
}
票数 66
EN

Stack Overflow用户

发布于 2019-09-10 04:15:40

代码语言:javascript
复制
func Middleware(h http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        // do stuff
        h.ServeHTTP(w, r)
    })
}
func Middleware2(s string) mux.MiddlewareFunc {
    return func(h http.Handler) http.Handler {
        return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
            // do stuff
            fmt.Println(s)
            h.ServeHTTP(w, r)
        })
    }
}
func main() {
    router := mux.NewRouter()


    router.Use(Middleware)
    //you can apply it to a sub-router too
    subRouter := router.PathPrefix("/sub_router/").Subrouter()
    subRouter.Use(Middleware2("somePrams"))
    // Add more middleware if you need call router.Use Again
    // router.Use(Middleware3, Middleware4, Middleware5)

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

the official doc on the mux website

票数 15
EN

Stack Overflow用户

发布于 2015-10-29 07:17:29

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

代码语言:javascript
复制
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)
})}
票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26204485

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档