Idempotence

Middleware idempotence của Fiber cho phép tạo các API chịu lỗi, nơi các yêu cầu lặp lại (ví dụ, do sự cố mạng của máy khách) không gây ra việc thực hiện cùng một thao tác nhiều lần trên máy chủ, làm nhiệm vụ như một cơ chế API idempotence chung.

Chữ ký hàm

func New(config ...Config) fiber.Handler

Mã ví dụ

Nhập gói middleware của bộ khung web Fiber.

import (
    "github.com/gofiber/fiber/v2"
    "github.com/gofiber/fiber/v2/middleware/idempotency"
)

Cấu hình mặc định

Sau khi khởi tạo ứng dụng Fiber, middleware có thể được tham chiếu trực tiếp.

app.Use(idempotency.New())

Cấu hình tùy chỉnh

app.Use(idempotency.New(idempotency.Config{
    Lifetime: 42 * time.Minute,
    // ...
}))

Các tùy chọn cấu hình

Thuộc tính Loại Mô tả Giá trị mặc định
Next func(*fiber.Ctx) bool Next xác định một hàm để bỏ qua middleware khi nó trả về true. Một hàm để sử dụng phương thức an toàn
Lifetime time.Duration Lifetime là tuổi thọ tối đa của khóa idempotence. 30 * time.Minute
KeyHeader string KeyHeader là tên của tiêu đề chứa khóa idempotence. "X-Idempotency-Key"
KeyHeaderValidate func(string) error KeyHeaderValidate xác định một hàm để xác thực cú pháp của tiêu đề idempotence. Một hàm để xác thực UUID
KeepResponseHeaders []string KeepResponseHeaders là danh sách các tiêu đề được bảo tồn từ phản hồi gốc. nil (bảo toàn tất cả tiêu đề)
Lock Locker Lock khoá khóa idempotence. Một khóa trong bộ nhớ
Storage fiber.Storage Storage lưu trữ dữ liệu phản hồi theo khóa idempotence. Lưu trữ trong bộ nhớ

Cấu hình mặc định

var ConfigDefault = Config{
    Next: func(c *fiber.Ctx) bool {
        // Bỏ qua middleware nếu yêu cầu được thực hiện bằng các phương pháp HTTP an toàn
        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 { // Độ dài UUID là 36 ký tự
            return fmt.Errorf("%w: độ dài không hợp lệ: %d != %d", ErrInvalidIdempotencyKey, l, wl)
        }
        return nil
    },
    KeepResponseHeaders: nil,
    Lock: nil, // Được đặt trong configDefault để tránh phân bổ dữ liệu ở đây
    Storage: nil, // Được đặt trong configDefault để tránh phân bổ dữ liệu ở đây
}