İdempotence

Fiber'ın idempotence ara yazılımı, tekrarlanan isteklerin (örneğin, istemci ağ sorunlarından kaynaklanan) sunucuda aynı işlemin yanlışlıkla birden çok kez gerçekleştirilmesine neden olmamasına izin verir ve genel bir API idempotence mekanizması olarak hizmet verir.

Fonksiyon İmzası

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

Örnek Kod

Fiber web çatısının ara yazılım paketini içe aktarın.

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

Varsayılan Yapılandırma

Fiber uygulamasını başlattıktan sonra, ara yazılıma doğrudan başvurulabilir.

app.Use(idempotency.New())

Özel Yapılandırma

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

Yapılandırma Seçenekleri

Özellik Tür Açıklama Varsayılan Değer
Next func(*fiber.Ctx) bool Next, true döndürdüğünde ara yazılımı atlamak için bir işlev tanımlar. Güvenli yöntem kullanımı için bir işlev
Lifetime time.Duration Lifetime, idempotence anahtarının maksimum ömrüdür. 30 * time.Minute
KeyHeader string KeyHeader, idempotence anahtarını içeren başlık adıdır. "X-Idempotency-Key"
KeyHeaderValidate func(string) error KeyHeaderValidate, idempotence başlığının sözdizimini doğrulamak için bir işlev tanımlar. UUID doğrulaması için bir işlev
KeepResponseHeaders []string KeepResponseHeaders, orijinal yanıtın saklanacağı başlık listesidir. nil (tüm başlıkları saklar)
Lock Locker Lock, idempotence anahtarını kilitler. Bellekte bir kilit
Storage fiber.Storage Storage, idempotence anahtarına göre yanıt verilerini depolar. Bellekte depolama

Varsayılan Yapılandırma

var ConfigDefault = Config{
    Next: func(c *fiber.Ctx) bool {
        // İstek güvenli HTTP yöntemleri kullanılarak yapıldıysa ara yazılımı atla
        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 uzunluğu 36 karakterdir
            return fmt.Errorf("%w: geçersiz uzunluk: %d != %d", ErrInvalidIdempotencyKey, l, wl)
        }
        return nil
    },
    KeepResponseHeaders: nil,
    Lock: nil, // Veri tahsisini burada önlemek için configDefault'ta ayarlandı
    Storage: nil, // Veri tahsisini burada önlemek için configDefault'ta ayarlandı
}