在Web请求之前执行功能

我正在尝试在每个Web请求之前执行</ em>一个功能。 我有一个简单的Web服务器:</ p>

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

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

/ *
注册一个在处理程序之前执行的函数,

  • /

    http.ListenAndServe(“:8080”,nil)
    }
    </ code> </ pre>

    问题 </ strong>:有一种简单的方法吗?</ p>
    </ div>

展开原文

原文

I am trying to execute a function before every web request. I got a simple web server:

func h1(w http.ResponseWriter, r *http.Request) {
  fmt.Pprintf("handler: %s
", "h1")
}
func h2(w http.ResponseWriter, r *http.Request) {
  fmt.Pprintf("handler: %s
", "h2")
}    
func h3(w http.ResponseWriter, r *http.Request) {
  fmt.Pprintf("handler: %s
", "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)
}

Question: Is there a simple way to do this?

1个回答



包装您的每个HandlerFuncs。</ p>

  func WrapHandler(f HandlerFunc)HandlerFunc {

return func(w http.ResponseWriter,r * http.Request){
//在此处调用任何预处理程序函数
mySpecialFunc()
f(w,r)
}
}

http。 HandleFunc(“ /”,WrapHandler(h1))
</ code> </ pre>

由于函数是Go中的头等值,因此很容易将它们包装,咖喱或其他任何东西 可能想和他们一起做。</ p>
</ div>

展开原文

原文

Wrap each of your HandlerFuncs.

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))

Since Functions are first class values in Go it's easy to wrap them, curry them, or any other thing you may want to do with them.

dsoy71058
dsoy71058 这非常优雅。 谢谢!
7 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐