Idempotencja

Middleware idempotencji w Fiber umożliwia tworzenie odpornych na błędy interfejsów API, gdzie powtarzające się żądania (np. z powodu problemów z siecią klienta) nie powodują błędnego wielokrotnego wykonania tej samej operacji po stronie serwera, służąc jako ogólny mechanizm idempotencji interfejsu API.

Sygnatura funkcji

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

Przykładowy kod

Zaimportuj pakiet middleware platformy internetowej Fiber.

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

Konfiguracja domyślna

Po zainicjowaniu aplikacji Fiber, middleware można bezpośrednio odwołać.

app.Use(idempotency.New())

Konfiguracja niestandardowa

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

Opcje konfiguracji

Właściwość Typ Opis Wartość domyślna
Next func(*fiber.Ctx) bool Next definiuje funkcję pomijającą middleware, gdy zwraca true. Funkcja do bezpiecznego użycia metody
Lifetime time.Duration Lifetime to maksymalna długość życia klucza idempotencji. 30 * time.Minute
KeyHeader string KeyHeader to nazwa nagłówka zawierającego klucz idempotencji. "X-Idempotency-Key"
KeyHeaderValidate func(string) error KeyHeaderValidate definiuje funkcję do walidacji składni nagłówka idempotencji. Funkcja do walidacji UUID
KeepResponseHeaders []string KeepResponseHeaders to lista nagłówków zachowanych z oryginalnej odpowiedzi. nil (zachowuje wszystkie nagłówki)
Lock Locker Lock blokuje klucz idempotencji. Blokada w pamięci
Storage fiber.Storage Storage przechowuje dane odpowiedzi zgodnie z kluczem idempotencji. Przechowywanie w pamięci

Konfiguracja domyślna

var ConfigDefault = Config{
    Next: func(c *fiber.Ctx) bool {
        // Pomij middleware, jeśli żądanie jest wykonane przy użyciu bezpiecznych metod HTTP
        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 { // Długość UUID to 36 znaków
            return fmt.Errorf("%w: błędna długość: %d != %d", ErrInvalidIdempotencyKey, l, wl)
        }
        return nil
    },
    KeepResponseHeaders: nil,
    Lock: nil, // Ustawione w configDefault, aby uniknąć alokacji danych tutaj
    Storage: nil, // Ustawione w configDefault, aby uniknąć alokacji danych tutaj
}