是否有一种简单的方法来设置在对gorilla / mux HTTP Web服务器发出的每个HTTP请求上调用的回调函数?他们似乎没有在他们的文档中设置回调函数的概念。
我想查看其中一个标题,以获取有关每次调用服务器的一些信息。
答案 0 :(得分:2)
gorilla / mux本身只是一个路由器和调度程序,虽然技术上可以做你所要求的,但它并不是它的设计目的。
“惯用”方法是使用中间件包装处理程序,中间件使用任何其他函数来装饰处理程序,例如在每次调用时检查标题以获取某些信息。
扩展大猩猩/多路复用器full example,您可以执行以下操作:
package main
import (
"log"
"net/http"
"github.com/gorilla/mux"
)
func HeaderCheckWrapper(requiredHeader string, original func(http.ResponseWriter, *http.Request)) func(http.ResponseWriter, *http.Request) {
return func(w http.ResponseWriter, r *http.Request) {
if foo, ok := r.Header[requiredHeader]; ok {
// do whatever with the header value, and then call the original:
log.Printf("Found header %q, with value %q", requiredHeader, foo)
original(w, r)
return
}
// otherwise reject the request
w.WriteHeader(http.StatusPreconditionFailed)
w.Write([]byte("missing expected header " + requiredHeader))
}
}
func YourHandler(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Gorilla!\n"))
}
func main() {
r := mux.NewRouter()
// Routes consist of a path and a handler function.
r.HandleFunc("/", HeaderCheckWrapper("X-Foo-Header", YourHandler))
// Bind to a port and pass our router in
log.Fatal(http.ListenAndServe(":8000", r))
}
答案 1 :(得分:2)
如果您想拥有一个可以接收路由器中所有请求的处理程序,您可以使用alice将处理程序链接在一起。
这是对所有传入请求采取行动的简单方法。
以下是一个例子:
$get = [ 'title', 'variants.title', 'variants.price.price', 'variants.colors' ];