Middleware: Logging Setiap Request
Memahami middleware sebagai pembungkus handler dan membuat logger yang mencatat setiap permintaan.
Masalah: kode yang berulang
Bayangkan kamu ingin mencatat (log) setiap request yang masuk. Menulis fmt.Println di setiap handler itu melelahkan dan mudah terlupa. Solusinya: middleware.
Middleware = pembungkus handler
Middleware adalah fungsi yang menerima sebuah handler, lalu mengembalikan handler baru yang melakukan sesuatu sebelum/sesudah handler asli dijalankan. Ibarat petugas keamanan di pintu masuk gedung: semua pengunjung lewat dia dulu.
func Logging(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fmt.Println("LOG:", r.Method, r.URL.Path) // 1. kerjaan middleware
next.ServeHTTP(w, r) // 2. teruskan ke handler asli
})
}
next— handler berikutnya (bisa handler asli atau middleware lain).http.HandlerFunc(...)— mengubah sebuah fungsi biasa menjadihttp.Handler.next.ServeHTTP(w, r)— "silakan lanjut". Kalau baris ini tidak dipanggil, request berhenti di middleware dan handler asli tidak pernah jalan (ini dipakai untuk autentikasi di bab berikutnya).
Memasang middleware
Bungkus seluruh mux, sehingga semua route ikut tercatat:
handler := Logging(mux)
http.ListenAndServe(":8080", handler)
Perhatikan: yang diberikan ke server sekarang adalah handler (hasil pembungkusan), bukan mux langsung.
Mencatat lebih banyak
Di aplikasi nyata, log biasanya juga memuat durasi (time.Since(start)) dan status code. Untuk latihan, kita cukup mencatat method dan path.