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
}