GoDasturchi
Middleware: Logging and Chaining

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.

example.go
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.

Hints (0/3)

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

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

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.

example.go
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.

Hints (0/3)

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