میانافزار
میانافزار در Gin راهی برای پردازش درخواستهای HTTP قبل از رسیدن به handlerهای مسیر فراهم میکند. یک تابع میانافزار همان امضای handler مسیر — gin.HandlerFunc — را دارد و معمولاً c.Next() را برای انتقال کنترل به handler بعدی در زنجیره فراخوانی میکند.
نحوه کار میانافزار
Gin از مدل پیاز برای اجرای میانافزار استفاده میکند. هر میانافزار در دو مرحله اجرا میشود:
- قبل از handler — کد قبل از
c.Next()قبل از handler مسیر اجرا میشود. - بعد از handler — کد بعد از
c.Next()پس از بازگشت handler مسیر اجرا میشود.
این به این معنی است که میانافزار مانند لایههای پیاز دور handler قرار میگیرد. اولین میانافزار متصل شده، بیرونیترین لایه است.
func Logger() gin.HandlerFunc { return func(c *gin.Context) { start := time.Now()
// Pre-handler phase c.Next()
// Post-handler phase latency := time.Since(start) log.Printf("Request took %v", latency) }}اتصال میانافزار
سه روش برای اتصال میانافزار در Gin وجود دارد:
// 1. Global -- applies to all routesrouter := gin.New()router.Use(Logger(), Recovery())
// 2. Group -- applies to all routes in the groupv1 := router.Group("/v1")v1.Use(AuthRequired()){ v1.GET("/users", listUsers)}
// 3. Per-route -- applies to a single routerouter.GET("/benchmark", BenchmarkMiddleware(), benchHandler)میانافزار متصل شده در محدوده وسیعتر ابتدا اجرا میشود. در مثال بالا، یک درخواست به GET /v1/users به ترتیب Logger سپس Recovery سپس AuthRequired سپس listUsers را اجرا خواهد کرد.
در این بخش
- استفاده از میانافزار — اتصال میانافزار به صورت سراسری، به گروهها یا مسیرهای منفرد
- میانافزار سفارشی — نوشتن توابع میانافزار خود
- استفاده از میانافزار BasicAuth — احراز هویت پایه HTTP
- گوروتینها در میانافزار — اجرای امن وظایف پسزمینه از میانافزار
- پیکربندی HTTP سفارشی — مدیریت خطا و بازیابی در میانافزار
- هدرهای امنیتی — تنظیم هدرهای امنیتی رایج