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í
}