一架梯子,一头程序猿,仰望星空!
Go Fiber教程 > 内容正文

Go Fiber API幂等


幂等性

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中设置,以避免在此处分配数据。
}