Middleware: Logging and Chaining
Middleware: loglash va zanjirlash
Middleware — handler'dan oldin (yoki keyin) ishlaydigan "o'rab oluvchi" funksiya: masalan har bir so'rovni logga yozish, vaqtni o'lchash. Bir xil ishni har bir handler'da qayta yozmaslik uchun ishlatiladi.
package main
import (
"fmt"
"net/http"
"net/http/httptest"
)
func withLogging(next http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
fmt.Printf("so'rov: %s %s\n", r.Method, r.URL.Path)
next(w, r)
}
}
func main() {
handler := func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "salom")
}
wrapped := withLogging(handler)
req := httptest.NewRequest("GET", "/salom", nil)
rec := httptest.NewRecorder()
wrapped(rec, req)
fmt.Println(rec.Body.String())
}withLogging — handler qabul qilib, yangi handler qaytaruvchi funksiya ("funksiyani funksiya o'raydi"). Ichkarida avval o'z ishini qiladi (logga yozadi), so'ng next(w, r) bilan asl handler'ni chaqiradi. Bir nechta middleware'ni birlashtirish uchun ularni ichma-ich chaqirish kifoya: withLogging(withAuth(handler)) — bu "zanjirlash" (chaining) deyiladi.
>_ Exercise
So'rov bajarilish vaqtini o'lchaydigan middleware yozing (soddalashtirilgan holda, faqat xabar chiqaring).
- •withPrefix(prefix, next) middleware'ini yozing: javobdan oldin prefix'ni chop etsin
- •handler'ni withPrefix bilan o'rab, "[LOG]" prefiksini bering
- •chaqirib, natijani tekshiring
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
Middleware — handler'ni "o'rab", undan oldin/keyin umumiy ishni (log, autentifikatsiya) bajaradigan naqsh; middleware'larni ichma-ich chaqirib zanjirlash mumkin.
NEXT UP
Middleware: Authentication
$ go run main.go
Kodingizni ishga tushiring