跳到主要内容
版本: v2.x

幂等性

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) boolNext 定义一个函数,当返回 true 时跳过此中间件。一个用于安全方法(safe methods)的函数
生命周期time.DurationLifetime 是幂等性键的最大生命周期。30 * time.Minute
KeyHeaderstringKeyHeader 是包含幂等性键的请求头的名称。"X-Idempotency-Key"
KeyHeaderValidatefunc(string) errorKeyHeaderValidate 定义一个函数用于验证幂等性请求头的语法。一个用于 UUID 验证的函数
KeepResponseHeaders[]stringKeepResponseHeaders 是应从原始响应中保留的请求头列表。nil (保留所有请求头)
LockerLock 锁定一个幂等性键。一个内存锁
存储fiber.StorageStorage 根据幂等性键存储响应数据。一个内存存储

默认配置

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