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
}