幂等性
Fiber的幂等性中间件允许创建容错的API,其中重复的请求(例如由于客户端网络问题)不会错误地导致服务器上执行相同的操作多次,就是一个通用的API幂等处理机制。
函数签名
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,
// ...
}))
配置选项
属性 | 类型 | 描述 | 默认值 |
---|---|---|---|
Next | func(*fiber.Ctx) bool |
Next定义一个函数,当返回true时,跳过该中间件。 | 一个用于安全方法的函数 |
Lifetime | time.Duration |
Lifetime是幂等性键的最大生存时间。 | 30 * time.Minute |
KeyHeader | string |
KeyHeader是包含幂等性键的标头的名称。 | “X-Idempotency-Key” |
KeyHeaderValidate | func(string) error |
KeyHeaderValidate定义一个用于验证幂等性标头的语法的函数。 | 一个用于UUID验证的函数 |
KeepResponseHeaders | []string |
KeepResponseHeaders是应从原始响应保留的标头列表。 | nil(保留所有标头) |
Lock | Locker |
Lock锁定幂等性键。 | 一个内存中的锁 |
Storage | fiber.Storage |
Storage存储按幂等性键的响应数据。 | 一个内存中的存储 |
默认配置
var ConfigDefault = Config{
Next: func(c *fiber.Ctx) bool {
// 如果请求是使用安全的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 { // UUID长度为36个字符
return fmt.Errorf("%w: 无效的长度: %d != %d", ErrInvalidIdempotencyKey, l, wl)
}
return nil
},
KeepResponseHeaders: nil,
Lock: nil, // 在configDefault中设置,以避免在此处分配数据。
Storage: nil, // 在configDefault中设置,以避免在此处分配数据。
}