使用Golang Gorilla包设置回调

时间:2016-12-06 22:09:36

标签: http go webserver gorilla

是否有一种简单的方法来设置在对gorilla / mux HTTP Web服务器发出的每个HTTP请求上调用的回调函数?他们似乎没有在他们的文档中设置回调函数的概念。

我想查看其中一个标题,以获取有关每次调用服务器的一些信息。

2 个答案:

答案 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' ];