Idempotence

Middleware idempotence dari Fiber memungkinkan pembuatan API yang fault-tolerant, di mana permintaan yang diulang (misalnya, karena masalah jaringan klien) tidak secara keliru menyebabkan operasi yang sama dieksekusi beberapa kali di server, berfungsi sebagai mekanisme idempotence API umum.

Tanda Tangan Fungsi

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

Contoh Kode

Impor paket middleware dari kerangka kerja web Fiber.

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

Konfigurasi Default

Setelah menginisialisasi aplikasi Fiber, middleware dapat langsung dirujuk.

app.Use(idempotency.New())

Konfigurasi Kustom

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

Opsi Konfigurasi

Properti Tipe Deskripsi Nilai Default
Next func(*fiber.Ctx) bool Next mendefinisikan fungsi untuk melewati middleware saat mengembalikan nilai true. Sebuah fungsi untuk penggunaan metode yang aman
Lifetime time.Duration Lifetime adalah umur maksimum kunci idempotence. 30 * time.Minute
KeyHeader string KeyHeader adalah nama header yang berisi kunci idempotence. "X-Idempotency-Key"
KeyHeaderValidate func(string) error KeyHeaderValidate mendefinisikan fungsi untuk memvalidasi sintaks header idempotence. Sebuah fungsi untuk validasi UUID
KeepResponseHeaders []string KeepResponseHeaders adalah daftar header yang akan dipertahankan dari respons asli. nil (mempertahankan semua header)
Lock Locker Lock mengunci kunci idempotence. Sebuah penguncian di memori
Storage fiber.Storage Storage menyimpan data respons sesuai dengan kunci idempotence. Penyimpanan di memori

Konfigurasi Default

var ConfigDefault = Config{
    Next: func(c *fiber.Ctx) bool {
        // Lewati middleware jika permintaan dibuat menggunakan metode HTTP yang aman
        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 { // Panjang UUID adalah 36 karakter
            return fmt.Errorf("%w: panjang tidak valid: %d != %d", ErrInvalidIdempotencyKey, l, wl)
        }
        return nil
    },
    KeepResponseHeaders: nil,
    Lock: nil, // Diatur di configDefault untuk menghindari alokasi data di sini
    Storage: nil, // Diatur di configDefault untuk menghindari alokasi data di sini
}