在Web请求之前执行功能

时间:2013-02-03 13:22:08

标签: http go webrequest

我正在尝试在每个Web请求之前执行一个函数。我有一个简单的Web服务器:

func h1(w http.ResponseWriter, r *http.Request) {
  fmt.Pprintf("handler: %s\n", "h1")
}
func h2(w http.ResponseWriter, r *http.Request) {
  fmt.Pprintf("handler: %s\n", "h2")
}    
func h3(w http.ResponseWriter, r *http.Request) {
  fmt.Pprintf("handler: %s\n", "h3")
}    

func main() {
  http.HandleFunc("/", h1)
  http.HandleFunc("/foo", h2)
  http.HandleFunc("/bar", h3)

  /*
    Register a function which is executed before the handlers,
    no matter what URL is called.
  */

  http.ListenAndServe(":8080", nil)
}

问题:有一种简单的方法吗?

1 个答案:

答案 0 :(得分:4)

包装每个HandlerFunc。

func WrapHandler(f HandlerFunc) HandlerFunc {
  return func(w http.ResponseWriter, r *http.Request) {
    // call any pre handler functions here
    mySpecialFunc()
    f(w, r)
  }
}

http.HandleFunc("/", WrapHandler(h1))

由于函数是Go中的第一类值,因此很容易将它们包装起来,咖喱它们或者你可能想要用它们做的任何其他事情。