همان‌گرایی

میان‌افزار همان‌گرایی Fiber امکان ایجاد API های مقاوم در برابر خطا را فراهم می‌کند که در آن‌جا درخواست‌های تکراری (مانند به دلیل مسائل شبکه مشتری) باعث اجرای چند باره‌ی عملیات مشابه بر روی سرور نمی‌شود، و به عنوان یک مکانیسم همان‌گرایی عمومی برای API ها عمل کرده وقتی که اجرا شود.

امضای تابع

func New(config ...Config) fiber.Handler

کد نمونه

وارد کردن بسته‌ی میان‌افزار میان‌گذاری Fiber web framework.

import (
    "github.com/gofiber/fiber/v2"
    "github.com/gofiber/fiber/v2/middleware/idempotency"
)

پیکربندی پیش‌فرض

بعد از مقداردهی اولیه برنامه Fiber، میان‌افزار می‌تواند به صورت مستقیم مورد استفاده قرار گیرد.

app.Use(idempotency.New())

پیکربندی سفارشی

app.Use(idempotency.New(idempotency.Config{
    Lifetime: 42 * time.Minute,
    // ...
}))

گزینه‌های پیکربندی

ویژگی نوع توضیحات مقدار پیش‌فرض
Next func(*fiber.Ctx) bool اگر مقداری درست باشد، میان‌افزار را می‌گذراند. یک تابع برای استفاده ایمن از متد‌ها
Lifetime time.Duration عمر مفید بیشترین مدت زمان برای کلید همانگرایی است. 30 * time.Minute
KeyHeader string نام هدری که شامل کلید همان‌گرایی است. "X-Idempotency-Key"
KeyHeaderValidate func(string) error یک تابع برای اعتبارسنجی نحوه‌ی هدر همان‌گرایی. یک تابع برای اعتبارسنجی UUID
KeepResponseHeaders []string لیست هدرهایی که از پاسخ اصلی نگهداری می‌شوند. nil (همه‌ی هدرها نگهداری می‌شوند)
Lock Locker قفل می‌کند کلید همانگرایی را. یک قفل در حافظه
Storage fiber.Storage مخزن داده‌های پاسخ بر اساس کلید همان‌گرایی. مخزن در حافظه

پیکربندی پیش‌فرض

var ConfigDefault = Config{
    Next: func(c *fiber.Ctx) bool {
        // میان‌افزار را نادیده بگیرد اگر درخواست از طریق متد‌های ایمن HTTP انجام شود
        return fiber.IsMethodSafe(c.Method())
    },
    Lifetime: 30 * time.Minute,
    KeyHeader: "X-Idempotency-Key",
    KeyHeaderValidate: func(k string) error {
        if l, wl := len(k), 36; l != wl { // طول UUID 36 کاراکتر است
            return fmt.Errorf("%w: invalid length: %d != %d", ErrInvalidIdempotencyKey, l, wl)
        }
        return nil
    },
    KeepResponseHeaders: nil,
    Lock: nil, // در configDefault تنظیم شده تا اینجا اختصاص داده‌های نرم‌افزاری را جلوگیری کند
    Storage: nil, // در configDefault تنظیم شده تا اینجا اختصاص داده‌های نرم‌افزاری را جلوگیری کند
}