ความแท้จริง
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 แล้วเพื่อหลีกเลี่ยงการจัดสร้างข้อมูลที่นี่
}