تو ورژن جدید گو serveMux تغییرات خوبی داشته، چطور به serveMux میدلور اضافه کنم؟
درود وقت بخیر
اگه بخوای به `serveMux` میدلور اضافه کنی، میتونی از یه الگوی ساده به اسم "زنجیره میدلورها" استفاده کنی. اینجوری میتونی یه سری کارها رو قبل یا بعد از اجرای هندلر اصلی انجام بدی. بزار یه مثال برات بزنم:
package main
import (
"fmt"
"net/http"
)
// تعریف نوع میدلور
type Middleware func(http.Handler) http.Handler
// تابعی برای زنجیر کردن میدلورها
func Chain(h http.Handler, middlewares ...Middleware) http.Handler {
for _, middleware := range middlewares {
h = middleware(h)
}
return h
}
// یه مثال از میدلور: لاگ گرفتن
func LoggingMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fmt.Printf("Request URI: %s\n", r.RequestURI)
next.ServeHTTP(w, r)
})
}
// یه مثال دیگه از میدلور: احراز هویت
func AuthMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Authorization") == "" {
http.Error(w, "Forbidden", http.StatusForbidden)
return
}
next.ServeHTTP(w, r)
})
}
// هندلر نهایی
func finalHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Hello, World!")
}
func main() {
mux := http.NewServeMux()
// اضافه کردن هندلر با میدلورها
mux.Handle("/", Chain(http.HandlerFunc(finalHandler), LoggingMiddleware, AuthMiddleware))
http.ListenAndServe(":8080", mux)
}
توی این مثال: 1. `Middleware` یه نوع جدید تعریف کردیم که یه هندلر `http.Handler` میگیره و یه هندلر `http.Handler` دیگه برمیگردونه. 2. تابع `Chain` رو برای زنجیر کردن میدلورها به هندلر اصلی استفاده میکنیم. 3. دو تا میدلور مثال تعریف کردیم: `LoggingMiddleware` برای لاگ گرفتن از درخواستها و `AuthMiddleware` برای چک کردن احراز هویت. 4. هندلر نهایی `finalHandler` یه پیغام ساده برمیگردونه. 5. تو تابع `main`، `serveMux` رو میسازیم و هندلر نهایی رو با استفاده از میدلورها بهش اضافه میکنیم.
این روش بهت اجازه میده به سادگی میدلورهای مختلف رو به `serveMux` اضافه کنی و یه زنجیره از میدلورها بسازی. موفق باشی 💎