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
}