Idempotenz
Das Idempotenz-Middleware von Fiber ermöglicht die Erstellung von fehlertoleranten APIs, bei denen wiederholte Anfragen (z. B. aufgrund von Client-Netzwerkproblemen) nicht fälschlicherweise dazu führen, dass derselbe Vorgang mehrmals auf dem Server ausgeführt wird. Sie dient als allgemecher Mechanismus zur Idempotenz von APIs.
Funktions-Signatur
func New(config ...Config) fiber.Handler
Beispielcode
Importieren Sie das Middleware-Paket des Fiber-Web-Frameworks.
import (
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/idempotency"
)
Standardkonfiguration
Nach Initialisierung der Fiber-Anwendung kann die Middleware direkt referenziert werden.
app.Use(idempotency.New())
Benutzerdefinierte Konfiguration
app.Use(idempotency.New(idempotency.Config{
Lifetime: 42 * time.Minute,
// ...
}))
Konfigurationsoptionen
Eigenschaft | Typ | Beschreibung | Standardwert |
---|---|---|---|
Next | func(*fiber.Ctx) bool |
Next definiert eine Funktion, um die Middleware zu überspringen, wenn sie true zurückgibt. | Eine Funktion für die sichere Methodennutzung |
Lifetime | time.Duration |
Lifetime ist die maximale Lebensdauer des Idempotenzschlüssels. | 30 * time.Minute |
KeyHeader | string |
KeyHeader ist der Name des Headers, der den Idempotenzschlüssel enthält. | "X-Idempotenz-Schlüssel" |
KeyHeaderValidate | func(string) error |
KeyHeaderValidate definiert eine Funktion zur Validierung der Syntax des Idempotenz-Headers. | Eine Funktion zur UUID-Validierung |
KeepResponseHeaders | []string |
KeepResponseHeaders ist die Liste der Header, die aus der Originalantwort erhalten bleiben sollen. | nil (bewahrt alle Header auf) |
Lock | Locker |
Lock sperrt den Idempotenzschlüssel. | Ein Lock im Speicher |
Storage | fiber.Storage |
Storage speichert die Antwortdaten gemäß dem Idempotenzschlüssel. | Speicher im Speicher |
Standardkonfiguration
var ConfigDefault = Config{
Next: func(c *fiber.Ctx) bool {
// Überspringt die Middleware, wenn die Anfrage mit sicheren HTTP-Methoden erfolgt
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 { // Die UUID hat eine Länge von 36 Zeichen
return fmt.Errorf("%w: ungültige Länge: %d != %d", ErrInvalidIdempotencyKey, l, wl)
}
return nil
},
KeepResponseHeaders: nil,
Lock: nil, // In configDefault festlegen, um hier keine Datenzuweisung vorzunehmen
Storage: nil, // In configDefault festlegen, um hier keine Datenzuweisung vorzunehmen
}