HTTP Middleware Pattern
HTTP middleware naqshi
Ko'pincha bir xil mantiqni (logging, autentifikatsiya, vaqtni o'lchash) ko'plab handler'larga qo'llash kerak bo'ladi, kodni nusxalamasdan. Yechim — middleware: bitta handler'ni oladi va uni o'rab, qo'shimcha xatti-harakat bilan yangi handler qaytaradigan funksiya.
func LoggingMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fmt.Printf("LOG: %s %s\n", r.Method, r.URL.Path)
next.ServeHTTP(w, r)
})
}http.HandlerFunc — oddiy funksiyani http.Handler interfeysiga aylantiradigan moslashtiruvchi (adapter) tur: bu Interfaces & Polymorphism kursidagi "funksiya turlari ham metodlarga ega bo'lishi mumkin" g'oyasining amaliy qo'llanilishi. LoggingMiddleware(handler) chaqirilganda, u so'rovni avval o'zi "ushlab qoladi" (log yozadi), so'ngra next.ServeHTTP(w, r) bilan asl handler'ga uzatadi — bu Project: Rate Limiter kursidagi RateLimitMiddlewarening aynan bir xil naqshi.
>_ Exercise
LoggingMiddleware(next http.Handler) http.Handler funksiyasini yozing. U har bir so'rov uchun "LOG: <metod> <yo'l>" qatorini (standart chiqishga, fmt.Printf bilan) chop etadi, so'ngra so'rovni nextga uzatadi. mainda oddiy "hello" yozadigan handler'ni shu middleware bilan o'rab, sinab ko'ring.
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
Middleware naqshi — http.Handler qabul qilib, uni qo'shimcha xatti-harakat bilan o'ragan yangi http.Handler qaytarish. http.HandlerFunc oddiy funksiyani http.Handlerga aylantiradigan standart moslashtiruvchi.
NEXT UP
Panic Recovery and Middleware Chains
$ go run main.go
Kodingizni ishga tushiring