один общий обработчик http вместо нескольких

Можно ли не копировать выражение вставки commonHanlder(handler1), commonHanlder(handler2) ... commonHanlder(handlerN) в этом коде:

rtr.HandleFunc("/", commonHanlder(handler1)).Methods("GET")
rtr.HandleFunc("/page2", commonHanlder(handler2)).Methods("GET")

и установите его в одном месте, например

http.ListenAndServe(":3000", commonHanlder(http.DefaultServeMux))

Но этот вариант не работает и при компиляции выдает две ошибки:

./goRelicAndMux.go:20: cannot use http.DefaultServeMux (type *http.ServeMux) as type gorelic.tHTTPHandlerFunc in argument to commonHanlder
./goRelicAndMux.go:20: cannot use commonHanlder(http.DefaultServeMux) (type gorelic.tHTTPHandlerFunc) as type http.Handler in argument to http.ListenAndServe:
    gorelic.tHTTPHandlerFunc does not implement http.Handler (missing ServeHTTP method)

Полный код:

package main

import (
    "github.com/gorilla/mux"
    "github.com/yvasiyarov/gorelic"
    "log"
    "net/http"
)

func main() {
    initNewRelic()
    rtr := mux.NewRouter()
    var commonHanlder = agent.WrapHTTPHandlerFunc

    rtr.HandleFunc("/", commonHanlder(handler1)).Methods("GET")
    rtr.HandleFunc("/page2", commonHanlder(handler2)).Methods("GET")

    http.Handle("/", rtr)
    log.Println("Listening...")
    http.ListenAndServe(":3000", http.DefaultServeMux)
}

func handler1(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("mainPage"))
}

func handler2(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("page 2"))
}

var agent *gorelic.Agent

func initNewRelic() {
    agent = gorelic.NewAgent()
    agent.Verbose = true
    agent.NewrelicName = "test"
    agent.NewrelicLicense = "new relic key"
    agent.Run()
}

person Maxim Yefremov    schedule 28.02.2015    source источник


Ответы (1)


Похоже, вы хотите вызвать commonHandler в корне вашего приложения и заставить его работать для всех. Поскольку вы используете мультиплексор, просто оберните маршрутизатор мультиплексора один раз.

func main() {
    initNewRelic()
    rtr := mux.NewRouter()
    var commonHandler = agent.WrapHTTPHandler

    rtr.HandleFunc("/", handler1).Methods("GET")
    rtr.HandleFunc("/page2", handler2).Methods("GET")

    http.Handle("/", commonHandler(rtr))
    log.Println("Listening...")
    http.ListenAndServe(":3000", nil)
}

Я также удалил ссылку http.DefaultServeMux в ListenAndServe, так как передача nil автоматически использует значение по умолчанию.

person Logiraptor    schedule 28.02.2015
comment
http.Handle("/", commonHanlder(rtr)) выдает ошибку cannot use rtr (type *mux.Router) as type gorelic.tHTTPHandlerFunc in argument to commonHanlder command - person Maxim Yefremov; 28.02.2015
comment
О да. Я упустил это из виду. Поскольку rtr — это не функция, а http.Handler, вам нужно использовать agent.WrapHTTPHandler, а не agent.WrapHTTPHandlerFunc. - person Logiraptor; 01.03.2015