Idempotencia

El middleware de idempotencia de Fiber permite la creación de APIs tolerantes a fallos, donde las solicitudes repetidas (por ejemplo, debido a problemas de red del cliente) no provocan erróneamente que la misma operación se ejecute múltiples veces en el servidor, sirviendo como un mecanismo general de idempotencia de API.

Firma de la función

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

Código de ejemplo

Importa el paquete de middleware del marco web Fiber.

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

Configuración predeterminada

Después de inicializar la aplicación de Fiber, el middleware puede ser referenciado directamente.

app.Use(idempotency.New())

Configuración personalizada

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

Opciones de Configuración

Propiedad Tipo Descripción Valor Predeterminado
Next func(*fiber.Ctx) bool Next define una función para omitir el middleware cuando devuelve true. Una función para el uso de métodos seguros
Lifetime time.Duration Lifetime es la vida máxima de la clave de idempotencia. 30 * time.Minute
KeyHeader string KeyHeader es el nombre del encabezado que contiene la clave de idempotencia. "X-Idempotency-Key"
KeyHeaderValidate func(string) error KeyHeaderValidate define una función para validar la sintaxis del encabezado de idempotencia. Una función para la validación de UUID
KeepResponseHeaders []string KeepResponseHeaders es la lista de encabezados que se conservarán de la respuesta original. nil (conserva todos los encabezados)
Lock Locker Lock bloquea la clave de idempotencia. Un bloqueo en memoria
Storage fiber.Storage Storage almacena los datos de la respuesta de acuerdo a la clave de idempotencia. Almacenamiento en memoria

Configuración Predeterminada

var ConfigDefault = Config{
    Next: func(c *fiber.Ctx) bool {
        // Omitir el middleware si la solicitud se realiza utilizando métodos HTTP seguros
        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 longitud de UUID es de 36 caracteres
            return fmt.Errorf("%w: longitud inválida: %d != %d", ErrInvalidIdempotencyKey, l, wl)
        }
        return nil
    },
    KeepResponseHeaders: nil,
    Lock: nil, // Establecido en configDefault para evitar la asignación de datos aquí
    Storage: nil, // Establecido en configDefault para evitar la asignación de datos aquí
}