幂等性
Fiber 的幂等性中间件允许构建容错的 API,其中重复的请求(例如由于客户端的网络问题)不会错误地导致在服务器端多次执行相同的操作。
请参阅 https://datatracker.ietf.org/doc/html/draft-ietf-httpapi-idempotency-key-header-02 以更好地理解。
签名
func New(config ...Config) fiber.Handler
示例
导入 Fiber Web 框架中的中间件包
import (
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/idempotency"
)
初始化 Fiber 应用后,可以使用以下方式
默认配置
app.Use(idempotency.New())
自定义配置
app.Use(idempotency.New(idempotency.Config{
Lifetime: 42 * time.Minute,
// ...
}))
配置
属性 | 类型 | 描述 | 默认值 |
---|---|---|---|
下一篇 | func(*fiber.Ctx) bool | Next 定义一个函数,当返回 true 时跳过此中间件。 | 一个用于安全方法(safe methods)的函数 |
生命周期 | time.Duration | Lifetime 是幂等性键的最大生命周期。 | 30 * time.Minute |
KeyHeader | string | KeyHeader 是包含幂等性键的请求头的名称。 | "X-Idempotency-Key" |
KeyHeaderValidate | func(string) error | KeyHeaderValidate 定义一个函数用于验证幂等性请求头的语法。 | 一个用于 UUID 验证的函数 |
KeepResponseHeaders | []string | KeepResponseHeaders 是应从原始响应中保留的请求头列表。 | nil (保留所有请求头) |
锁 | Locker | Lock 锁定一个幂等性键。 | 一个内存锁 |
存储 | fiber.Storage | Storage 根据幂等性键存储响应数据。 | 一个内存存储 |
默认配置
var ConfigDefault = Config{
Next: func(c *fiber.Ctx) bool {
// Skip middleware if the request was done using a safe HTTP method
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 { // UUID length is 36 chars
return fmt.Errorf("%w: invalid length: %d != %d", ErrInvalidIdempotencyKey, l, wl)
}
return nil
},
KeepResponseHeaders: nil,
Lock: nil, // Set in configDefault so we don't allocate data here.
Storage: nil, // Set in configDefault so we don't allocate data here.
}