Idempotence

Le middleware d'idempotence de Fiber permet de créer des API tolérantes aux pannes, où les demandes répétées (par exemple, en raison de problèmes de réseau client) ne provoquent pas l'exécution erronée de la même opération plusieurs fois sur le serveur, servant de mécanisme d'idempotence général pour l'API.

Signature de la fonction

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

Exemple de code

Importer le package middleware du framework web Fiber.

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

Configuration par défaut

Après l'initialisation de l'application Fiber, le middleware peut être directement référencé.

app.Use(idempotency.New())

Configuration personnalisée

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

Options de configuration

Propriété Type Description Valeur par défaut
Next func(*fiber.Ctx) bool Next définit une fonction pour ignorer le middleware lorsqu'elle renvoie true. Une fonction pour une utilisation sûre des méthodes
Lifetime time.Duration Lifetime est la durée de vie maximale de la clé d'idempotence. 30 * time.Minute
KeyHeader string KeyHeader est le nom de l'en-tête contenant la clé d'idempotence. "X-Idempotency-Key"
KeyHeaderValidate func(string) error KeyHeaderValidate définit une fonction pour valider la syntaxe de l'en-tête d'idempotence. Une fonction pour la validation UUID
KeepResponseHeaders []string KeepResponseHeaders est la liste des en-têtes à conserver de la réponse d'origine. nil (conserve tous les en-têtes)
Lock Locker Lock verrouille la clé d'idempotence. Un verrou en mémoire
Storage fiber.Storage Storage stocke les données de réponse selon la clé d'idempotence. Stockage en mémoire

Configuration par défaut

var ConfigDefault = Config{
    Next: func(c *fiber.Ctx) bool {
        // Ignorer le middleware si la demande est effectuée à l'aide de méthodes HTTP sûres
        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 longueur de l'UUID est de 36 caractères
            return fmt.Errorf("%w: longueur invalide: %d != %d", ErrInvalidIdempotencyKey, l, wl)
        }
        return nil
    },
    KeepResponseHeaders: nil,
    Lock: nil, // Défini dans configDefault pour éviter l'allocation de données ici
    Storage: nil, // Défini dans configDefault pour éviter l'allocation de données ici
}