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
}