Go uygulamalarındaki HTTP sunucusu ve yönlendirici ara katmanlarını zincirlemek için aşağıdaki örneği kullanabilirsiniz. Bir ara katman her istek için bir kez çalışır. Sunucusu ara katmanları sisteme gelen her istek için devreye girerler ama, yönlendirici ara katmanları sadece bağlı bulundukları adrese gelen istekler için devreye girerler.


Ara katman


Zincire ilk eklenen ara katman, en son çalışır. Ayrıca sunucu seviyesi ara katmanı, her zaman yönlendirici seviyesi ara katmanından önce çalışır.


package middleware

import (
"net/http"
)

type (
// srv represents multi layer server level middleware list and is dedicated
// Server function.
srv func(http.Handler) http.Handler
// rtr represents multi layer router level middleware list and is dedicated
// to Router function.
rtr func(http.HandlerFunc) http.HandlerFunc
)

func Server(h http.Handler, mid ...srv) http.Handler {
for _, m := range mid {
h = m(h)
}

return h
}

func Router(h http.HandlerFunc, mid ...rtr) http.HandlerFunc {
for _, m := range mid {
h = m(h)
}

return h
}

Kullanım


Sunucu


func Mid1(h http.Handler) http.Handler {
return http.HandlerFunc(func(rw http.ResponseWriter, rq *http.Request) {
// Do something

h.ServeHTTP(rw, rq)
})
}

func Mid2(h http.Handler) http.Handler {
return http.HandlerFunc(func(rw http.ResponseWriter, rq *http.Request) {
// Do something

h.ServeHTTP(rw, rq)
})
}

// This is how you wire them up.
s:= &http.Server{
Addr: ":8080",
Handler: middleware.Server(
someRouter,
Mid1,
Mid2,
),
}

Yönlendirici


func Mid1(handler http.HandlerFunc) http.HandlerFunc {
return func(rw http.ResponseWriter, rq *http.Request) {
// Do something

handler(rw, rq)
}
}

func Mid2(handler http.HandlerFunc) http.HandlerFunc {
return func(rw http.ResponseWriter, rq *http.Request) {
// Do something

handler(rw, rq)
}
}

// github.com/julienschmidt/httprouter
r := httprouter.New()

// This is how you wire them up.
r.HandlerFunc(
http.MethodGet,
"/leagues/:id",
middleware.Router(
league.Get,
Mid1,
Mid2,
))

// This does not use any middleware.
r.HandlerFunc(
http.MethodPost,
"/leagues",
league.Post,
))

// league.Post
func Get(rw http.ResponseWriter, rq *http.Request) {
// ...
}

// league.Post
func Post(rw http.ResponseWriter, rq *http.Request) {
// ...
}