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
}