ความแท้จริง

Middleware ที่เป็น idempotence ใน Fiber ช่วยให้เราสามารถสร้าง API ที่ทนทานต่อข้อบกพร่อง โดยที่การร้องขอซ้ำ (เช่น เนื่องจากปัญหาของเครือข่ายของลูกค้า) จะไม่ทำให้การดำเนินการเดิมที่เกิดขึ้นหลายครั้งบนเซิร์ฟเวอร์โดยไม่ปรากฏว่ามันผิด นำมาเป็นกลไกที่ทำให้ API ทั่วไปเป็น idempotence

ฟังก์ชันลายเซ็นเจาะจง

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

ตัวอย่างโค้ด

นำเข้าไฟล์แพ็คเกจของ Fiber web framework

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

การกำหนดค่าเริ่มต้น

หลังจากที่เราได้เริ่มต้นแอปพลิเคชันของ Fiber แล้ว สามารถใช้ middleware ได้โดยตรง

app.Use(idempotency.New())

การกำหนดค่าที่กำหนดเอง

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

ตัวเลือกการกำหนดค่า

คุณสมบัติ ชนิดข้อมูล คำอธิบาย ค่าเริ่มต้น
Next func(*fiber.Ctx) bool Next กำหนดฟังก์ชันเพื่อข้าม middleware เมื่อมันคืนค่า true ฟังก์ชันสำหรับการใช้งาน HTTP method อย่างปลอดภัย
Lifetime time.Duration Lifetime เป็นอายุการใช้งานสูงสุดของคีย์ idempotence 30 * time.Minute
KeyHeader string KeyHeader เป็นชื่อของเฮดเดอร์ที่บรรจุคีย์ idempotence "X-Idempotency-Key"
KeyHeaderValidate func(string) error KeyHeaderValidate กำหนดฟังก์ชันสำหรับการตรวจสอบสัณระไขของเฮดเดอร์ idempotence ฟังก์ชันสำหรับการตรวจสอบ UUID
KeepResponseHeaders []string KeepResponseHeaders เป็นรายการของเฮดเดอร์ที่จะถูกเก็บจากการตอบกลับเดิม nil (เก็บเฮดเดอร์ทั้งหมด)
Lock Locker Lock ล็อคคีย์ idempotence ล็อคในหน่วยความจำ
Storage fiber.Storage Storage เก็บข้อมูลการตอบกลับตามคีย์ idempotence Storage ในหน่วยความจำ

การกำหนดค่าเริ่มต้น

var ConfigDefault = Config{
    Next: func(c *fiber.Ctx) bool {
        // ข้าม middleware หากการร้องขอถูกทำโดยใช้เมทอด 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, // กำหนดที่ config แล้วเพื่อหลีกเลี่ยงการจัดสร้างข้อมูลที่นี่
    Storage: nil, // กำหนดที่ config แล้วเพื่อหลีกเลี่ยงการจัดสร้างข้อมูลที่นี่
}