رفتن به محتوا

استفاده از میان‌افزار

میان‌افزار در Gin توابعی هستند که قبل (و اختیاراً بعد) از handler مسیر شما اجرا می‌شوند. آن‌ها برای مسائل مشترک مانند لاگ‌گذاری، احراز هویت، بازیابی خطا و تغییر درخواست استفاده می‌شوند.

Gin از سه سطح اتصال میان‌افزار پشتیبانی می‌کند:

  • میان‌افزار سراسری — روی هر مسیر در روتر اعمال می‌شود. با router.Use() ثبت می‌شود. مناسب برای مسائلی مانند لاگ‌گذاری و بازیابی panic که به صورت جهانی اعمال می‌شوند.
  • میان‌افزار گروهی — روی تمام مسیرهای یک گروه مسیر اعمال می‌شود. با group.Use() ثبت می‌شود. مفید برای اعمال احراز هویت یا مجوزدهی به زیرمجموعه‌ای از مسیرها (مثلاً تمام مسیرهای /admin/*).
  • میان‌افزار هر مسیر — فقط روی یک مسیر واحد اعمال می‌شود. به عنوان آرگومان‌های اضافی به router.GET()، router.POST() و غیره ارسال می‌شود. مفید برای منطق خاص مسیر مانند محدودیت نرخ سفارشی یا اعتبارسنجی ورودی.

ترتیب اجرا: توابع میان‌افزار به ترتیبی که ثبت شده‌اند اجرا می‌شوند. وقتی یک میان‌افزار c.Next() را فراخوانی می‌کند، کنترل را به میان‌افزار بعدی (یا handler نهایی) منتقل می‌کند و سپس اجرا پس از بازگشت c.Next() از سر گرفته می‌شود. این یک الگوی مانند پشته (LIFO) ایجاد می‌کند — اولین میان‌افزار ثبت شده اولین شروع‌کننده اما آخرین پایان‌دهنده است. اگر میان‌افزاری c.Next() را فراخوانی نکند، میان‌افزارها و handler بعدی رد می‌شوند (مفید برای قطع زودهنگام با 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")
}