Подтвердить что ты не робот

Специальное промежуточное ПО

Я использую gorilla mux для управления маршрутизацией. То, что мне не хватает, - это интегрировать промежуточное программное обеспечение между каждым запросом.

Например

package main

import (
    "fmt"
    "github.com/gorilla/mux"
    "log"
    "net/http"
    "strconv"
)

func HomeHandler(response http.ResponseWriter, request *http.Request) {

    fmt.Fprintf(response, "Hello home")
}

func main() {

    port := 3000
    portstring := strconv.Itoa(port)

    r := mux.NewRouter()
    r.HandleFunc("/", HomeHandler)
    http.Handle("/", r)

    log.Print("Listening on port " + portstring + " ... ")
    err := http.ListenAndServe(":"+portstring, nil)
    if err != nil {
        log.Fatal("ListenAndServe error: ", err)
    }
}

Каждый входящий запрос должен проходить через промежуточное программное обеспечение. Как я могу интегрировать здесь среднюю программу?

Обновление

Я буду использовать его в сочетании с гориллой/сеансами, и они говорят:

Важное примечание. Если вы не используете gorilla/mux, вам необходимо обернуть обработчики с context.ClearHandler, иначе вы будете утечки памяти! простой способ сделать это - обернуть мультиплексор верхнего уровня при вызове http.ListenAndServe:

Как я могу предотвратить этот сценарий?

4b9b3361

Ответ 1

Просто создайте оболочку, это довольно легко в Go:

func HomeHandler(response http.ResponseWriter, request *http.Request) {

    fmt.Fprintf(response, "Hello home")
}

func Middleware(h http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        log.Println("middleware", r.URL)
        h.ServeHTTP(w, r)
    })
}
func main() {
    r := mux.NewRouter()
    r.HandleFunc("/", HomeHandler)
    http.Handle("/", Middleware(r))
}

Ответ 2

Я не уверен, почему @OneOfOne решил подключить маршрутизатор к промежуточному ПО, я думаю, что это немного лучше:

func main() {
    r.Handle("/",Middleware(http.HandlerFunc(homeHandler)))
    http.Handle("/", r)
}

func Middleware(h http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    h.ServeHTTP(w, r)
})}

Ответ 3

Если вы хотите применить цепочку промежуточного программного обеспечения ко всем маршрутам маршрутизатора или подпроцессора, вы можете использовать вилку мусора Gorilla https://github.com/bezrukovspb/mux

subRouter := router.PathPrefix("/use-a-b").Subrouter().Use(middlewareA, middlewareB)
subRouter.Path("/hello").HandlerFunc(requestHandlerFunc)

Ответ 4

Вы можете рассмотреть пакет промежуточного программного обеспечения, например negroni.

Ответ 5

func Middleware(h http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        // do stuff
        h.ServeHTTP(w, r)
    })
}

func main () {
    router := mux.NewRouter()
    router.Use(Middleware)
    // Add more middleware if you need
    // router.Use(Middleware2) 
    // router.Use(Middleware3)

    _ = http.ListenAndServe(":80", router)
}