Lewati ke konten

Menggunakan middleware

Middleware di Gin adalah fungsi yang berjalan sebelum (dan opsional setelah) handler rute Anda. Middleware digunakan untuk kepentingan lintas-sektoral seperti logging, autentikasi, recovery error, dan modifikasi permintaan.

Gin mendukung tiga level pemasangan middleware:

  • Middleware global — Diterapkan ke setiap rute dalam router. Didaftarkan dengan router.Use(). Baik untuk kepentingan seperti logging dan recovery panic yang berlaku secara universal.
  • Middleware grup — Diterapkan ke semua rute dalam grup rute. Didaftarkan dengan group.Use(). Berguna untuk menerapkan autentikasi atau otorisasi ke subset rute (mis., semua rute /admin/*).
  • Middleware per-rute — Diterapkan ke satu rute saja. Diteruskan sebagai argumen tambahan ke router.GET(), router.POST(), dll. Berguna untuk logika spesifik rute seperti rate limiting kustom atau validasi input.

Urutan eksekusi: Fungsi middleware dieksekusi sesuai urutan pendaftarannya. Ketika middleware memanggil c.Next(), ia meneruskan kontrol ke middleware berikutnya (atau handler akhir), dan kemudian melanjutkan eksekusi setelah c.Next() selesai. Ini menciptakan pola seperti stack (LIFO) — middleware pertama yang didaftarkan adalah yang pertama dimulai tetapi terakhir selesai. Jika middleware tidak memanggil c.Next(), middleware dan handler selanjutnya dilewati (berguna untuk short-circuiting dengan c.Abort()).

package main
import (
"github.com/gin-gonic/gin"
)
func main() {
// Creates a router without any middleware by default
router := gin.New()
// Global middleware
// Logger middleware will write the logs to gin.DefaultWriter even if you set with GIN_MODE=release.
// By default gin.DefaultWriter = os.Stdout
router.Use(gin.Logger())
// Recovery middleware recovers from any panics and writes a 500 if there was one.
router.Use(gin.Recovery())
// Per route middleware, you can add as many as you desire.
router.GET("/benchmark", MyBenchLogger(), benchEndpoint)
// Authorization group
// authorized := router.Group("/", AuthRequired())
// exactly the same as:
authorized := router.Group("/")
// per group middleware! in this case we use the custom created
// AuthRequired() middleware just in the "authorized" group.
authorized.Use(AuthRequired())
{
authorized.POST("/login", loginEndpoint)
authorized.POST("/submit", submitEndpoint)
authorized.POST("/read", readEndpoint)
// nested group
testing := authorized.Group("testing")
testing.GET("/analytics", analyticsEndpoint)
}
// Listen and serve on 0.0.0.0:8080
router.Run(":8080")
}