23/12/2019 - GO
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.
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
}
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,
),
}
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) {
// ...
}