Cara Membangun Middleware yang Efektif
Bagian-bagian penyusun
Middleware biasanya terdiri dari dua bagian:
-
Bagian pertama dieksekusi sekali, saat Anda menginisialisasi middleware Anda. Di sinilah Anda menyiapkan objek global, logika konfigurasi, dll.—semua yang hanya perlu terjadi sekali selama masa hidup aplikasi.
-
Bagian kedua dieksekusi pada setiap permintaan. Misalnya, dalam middleware database, Anda akan menyuntikkan objek database global ke dalam context permintaan. Setelah berada di dalam context, middleware lain dan fungsi handler Anda dapat mengambil dan menggunakannya.
func funcName(params string) gin.HandlerFunc { // <--- // This is part one // ---> // Example initialization: validate input params if err := check(params); err != nil { panic(err) }
return func(c *gin.Context) { // <--- // This is part two // ---> // Example execution per request: inject into context c.Set("TestVar", params) c.Next() }}Proses eksekusi
Mari kita lihat contoh kode berikut:
func main() { router := gin.Default()
router.Use(globalMiddleware())
router.GET("/rest/n/api/*some", mid1(), mid2(), handler)
router.Run()}
func globalMiddleware() gin.HandlerFunc { fmt.Println("globalMiddleware...1")
return func(c *gin.Context) { fmt.Println("globalMiddleware...2") c.Next() fmt.Println("globalMiddleware...3") }}
func handler(c *gin.Context) { fmt.Println("exec handler.")}
func mid1() gin.HandlerFunc { fmt.Println("mid1...1")
return func(c *gin.Context) {
fmt.Println("mid1...2") c.Next() fmt.Println("mid1...3") }}
func mid2() gin.HandlerFunc { fmt.Println("mid2...1")
return func(c *gin.Context) { fmt.Println("mid2...2") c.Next() fmt.Println("mid2...3") }}Sesuai dengan bagian Bagian-bagian penyusun di atas, ketika Anda menjalankan proses Gin, bagian pertama dari setiap middleware dieksekusi terlebih dahulu dan mencetak informasi berikut:
globalMiddleware...1mid1...1mid2...1Urutan inisialisasi adalah:
globalMiddleware...1 | vmid1...1 | vmid2...1Ketika Anda membuat permintaan—misalnya, curl -v localhost:8080/rest/n/api/some—bagian kedua dari setiap middleware dieksekusi secara berurutan dan menghasilkan output berikut:
globalMiddleware...2mid1...2mid2...2exec handler.mid2...3mid1...3globalMiddleware...3Dengan kata lain, urutan eksekusi adalah:
globalMiddleware...2 | vmid1...2 | vmid2...2 | vexec handler. | vmid2...3 | vmid1...3 | vglobalMiddleware...3