Idempotency

  1. Rate Limiting
  2. JWT Authentication
  3. Idempotency
  4. API Keys
  5. API Versioning
  6. Pagination
  7. Consistent Error Format
Client
Server

Before

class ChargeController
{
    public function store(Request $request): JsonResponse
    {
        // a retried request charges the card again
        $receipt = $this->gateway->charge($request->amount);

        return response()->json($receipt);
    }
}

After

class ChargeController
{
    public function store(Request $request): JsonResponse
    {
        $key = $request->header('Idempotency-Key');

        if ($cached = Cache::get("charge:{$key}")) {
            return response()->json($cached);
        }

        $receipt = $this->gateway->charge($request->amount);
        Cache::put("charge:{$key}", $receipt, now()->addDay());
        return response()->json($receipt);
    }
}
{CC}