در گولنگ Middleware شبیه یک تیم از نگهبانان متخصص هست که درخواستهای HTTP را قبل از رسیدن به منطق اصلی برنامه شما پردازش و مدیریت میکنه.
در این پست، به طور عمیق به ایجاد و استفاده از middleware برای ثبت لاگ، احراز هویت، و مدیریت خطاها میپردازیم تا به شما در تقویت برنامههای وب Go و جلوگیری از مشکلات رایج کمک کنیم و عملکرد آنها را بهبود بخشیم.
برای شروع، ابتدا یک سرور وب ساده با استفاده از بستهی net/http
راهاندازی میکنیم.
package main
import (
"log"
"net/http"
)
func main() {
// Define a handler function for the main logic
mainHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello, World!"))
})
// Use the middleware chain with mainHandler
http.Handle("/", Logger(Authenticate(mainHandler)))
// Start the server on port 8080
log.Println("Server listening on port 8080...")
log.Fatal(http.ListenAndServe(":8080", nil))
}
توضیح:
mainHandler
یک تابع handler ساده است که به درخواستها با "Hello, World!" پاسخ میدهد.mainHandler
زنجیر شدهاند.http.ListenAndServe
فعال و گوش میدهد.این middleware اطلاعات مربوط به درخواستهای ورودی را قبل از اینکه آنها را به handler بعدی ارسال کند ثبت میکند.
func Logger(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// Log the request URI and method
log.Printf("Request URI: %s, Method: %s", r.RequestURI, r.Method)
// Call the next handler
next.ServeHTTP(w, r)
})
}
توضیح:
Logger
درخواستهای URI و متد HTTP را با استفاده از بسته log
ثبت میکند.این middleware اعتبار درخواستهای ورودی را بر اساس معیارهای از پیش تعریفشده بررسی میکند، مثل بررسی وجود توکن معتبر.
func Authenticate(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// Dummy authentication check (example: check if the request has a valid token)
token := r.Header.Get("Authorization")
if token != "valid_token" {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
// Call the next handler
next.ServeHTTP(w, r)
})
}
توضیح:
Authenticate
بررسی میکند که آیا توکن معتبر در هدر Authorization درخواست وجود دارد.این middleware با استفاده از recover
از خطاهای غیرمنتظره بازیابی میکند و یک پاسخ مناسب ارسال میکند.
func ErrorHandler(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// Recover from panics and handle errors
defer func() {
if r := recover(); r != nil {
log.Printf("Recovered from panic: %v", r)
http.Error(w, "Internal Server Error", http.StatusInternalServerError)
}
}()
// Call the next handler
next.ServeHTTP(w, r)
})
}
توضیح:
ErrorHandler
با استفاده از defer
و recover()
از panic ها بازیابی میکند.میتوانید middleware را با handler اصلی خود ادغام کنید تا عملکرد و قابلیت اطمینان سرور وب خود را بهبود بخشید.
func main() {
// Define a handler function for the main logic
mainHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// Business logic here
w.Write([]byte("Hello, World!"))
})
// Use the middleware chain with mainHandler
http.Handle("/", ErrorHandler(Logger(Authenticate(mainHandler))))
// Start the server on port 8080
log.Println("Server listening on port 8080...")
log.Fatal(http.ListenAndServe(":8080", nil))
}
توضیح:
mainHandler
زنجیر شدهاند.ErrorHandler
، سپس Logger
و در نهایت Authenticate
، تا خطاها در اولویت مدیریت شوند و سپس لاگها ثبت و احراز هویت انجام شود.
امیدوارم این مقاله برای شما مفید بوده باشه. سعی میکنم از این پس مقالات بیشتری در مورد گولنگ بذارم. خوشحال میشم از قسمت نظرات، نظر خودتون رو با ما در میون بذارید.
برای اطلاع از پاسخ به نظر شما می توانید ایمیل یا شماره موبایل خود را وارد نمایید. *
ایمیل و شماره موبایل شما کاملا مخفی خواهد ماند و در سایت نمایش داده نخواهد شد. *
هنوز برای این مطلب نظری ارسال نشده است!