Idempotenza

Il middleware di idempotenza di Fiber consente la creazione di API tolleranti ai guasti, dove le richieste ripetute (ad esempio, a causa di problemi di rete del client) non causano erroneamente l'esecuzione multipla della stessa operazione sul server, fungendo da meccanismo di idempotenza generale dell'API.

Firma della Funzione

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

Codice Esempio

Importare il pacchetto del middleware del framework web di Fiber.

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

Configurazione Predefinita

Dopo l'inizializzazione dell'applicazione Fiber, il middleware può essere direttamente referenziato.

app.Use(idempotency.New())

Configurazione Personalizzata

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

Opzioni di Configurazione

Proprietà Tipo Descrizione Valore Predefinito
Next func(*fiber.Ctx) bool Next definisce una funzione per saltare il middleware quando restituisce true. Una funzione per l'uso sicuro dei metodi
Lifetime time.Duration Lifetime è la durata massima della chiave di idempotenza. 30 * time.Minute
KeyHeader string KeyHeader è il nome dell'intestazione che contiene la chiave di idempotenza. "X-Idempotency-Key"
KeyHeaderValidate func(string) error KeyHeaderValidate definisce una funzione per la convalida della sintassi dell'intestazione di idempotenza. Una funzione per la convalida UUID
KeepResponseHeaders []string KeepResponseHeaders è l'elenco delle intestazioni da preservare dalla risposta originale. nil (preserva tutte le intestazioni)
Lock Locker Lock blocca la chiave di idempotenza. Un blocco in memoria
Storage fiber.Storage Storage memorizza i dati di risposta in base alla chiave di idempotenza. Memorizzazione in memoria

Configurazione Predefinita

var ConfigDefault = Config{
    Next: func(c *fiber.Ctx) bool {
        // Salta il middleware se la richiesta viene effettuata utilizzando metodi HTTP sicuri
        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 { // La lunghezza UUID è di 36 caratteri
            return fmt.Errorf("%w: lunghezza non valida: %d != %d", ErrInvalidIdempotencyKey, l, wl)
        }
        return nil
    },
    KeepResponseHeaders: nil,
    Lock: nil, // Impostato in configDefault per evitare l'allocazione di dati qui
    Storage: nil, // Impostato in configDefault per evitare l'allocazione di dati qui
}