Go中的路由器 - 在每个http请求之前运行一个函数

时间:2015-08-02 10:21:01

标签: go routes

我正在使用Go with http和Go:

mux := http.NewServeMux()
mux.HandleFunc("/API/user", test)
mux.HandleFunc("/authAPI/admin", auth)

我想在每个http请求之前运行一个函数 更好的是,在每个包含/ authAPI /的请求上运行一个函数 我怎样才能在Go中实现这个目标?

2 个答案:

答案 0 :(得分:3)

除了@Thomas提出的建议之外,您可以将整个多路复用器包装在您调用任何处理程序之前调用的自己的多路复用器中,并且可以只调用它自己的处理程序。那就是替代http路由器在go中的实现方式。例如:

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Handled %s", r.RequestURI)
}


func main(){
    // this will do the actual routing, but it's not mandatory, 
    // we can write a custom router if we want
    mux := http.NewServeMux()
    mux.HandleFunc("/foo", handler)
    mux.HandleFunc("/bar", handler)

    // we pass a custom http handler that does preprocessing and calls mux to call the actual handler
    http.ListenAndServe(":8081", http.HandlerFunc(func (w http.ResponseWriter, r *http.Request){
        fmt.Fprintln(w, "Preprocessing yo")
        mux.ServeHTTP(w,r)
    }))
}

答案 1 :(得分:2)

你可以写一个包装函数:

func wrapHandlerFunc(handler http.HandlerFunc) http.HandlerFunc {
  return func(w http.ResponseWriter, req *http.Request) {
    // ...
    // do something
    // ...
    handler(w, req)
  }
}

并像这样使用它:

mux.HandleFunc("/authAPI/admin", wrapHandlerFunc(auth))

据我所知,在给定的URL树(子路由器,mux用语)下自动运行它是不受支持的。