AIM Tech

لو المستخدم ضغط الزر مرتين؟ هنا ييجي دور الـ Idempotency في إنقاذ الموقف

ما هو الـ Idempotency؟

Idempotency هو خاصية بتضمن إنه لو بعت نفس الـ API Request أكثر من مرة، النتيجة النهائية ما تتغيرش، كأنك نفذته مرة واحدة فقط.

تخيّلي السيناريو:

واحدة بتحجز موعد عند طبيب من خلال تطبيق إلكتروني.
ضغطت على زر “احجز الآن” ➜ لكن النت قطع قبل ما يوصل الرد من السيرفر.
فكّرت إن العملية فشلت ➜ رجعت وضغطت “احجز الآن” مرة تانية

💥 بدون Idempotency:

  • السيرفر استقبل الطلب مرتين.
  • اتسجل موعدين لنفس الشخص في نفس اليوم.
  • الدكتور نفسه مش هيعرف يعالج المريض مرتين.
  • وبتبدأ مشاكل في الجدولة، وDouble Booking.

طيب، الحل؟

➤ نستخدم Idempotency Key:

في كل مرة المستخدم يضغط “احجز”، التطبيق يولّد مفتاح (UUID مثلاً):

POST /appointments
Idempotency-Key: abc123xyz
Body:
{
“patient_id”: 88,
“doctor_id”: 12,
“date”: “2025-08-03T11:00:00”
}

➤ السيرفر يشوف الـ Key:

  • هل استقبلت طلب بهذا المفتاح من قبل؟ ✅
  • لو نعم: يرجّع نفس الموعد بدون تنفيذ جديد.
  • لو لأ: يسجل الموعد ويخزن الـ Key معاه في قاعدة البيانات

والنتيجة؟

  • المستخدم ضغط مرتين ➜ لكن حُجز موعد واحد فقط.
  • التطبيق صار ذكي ويتعامل مع حالات الشبكة الضعيفة.
  • تجربة المستخدم أصبحت أكثر احترافية وموثوقة.
  • ما فيش تضارب في جدول المواعيد.

🎯 ليه المثال ده مهم في الاختبار؟

لأن ده موقف بيتكرر يوميًا:

  • المستخدم مش دايمًا يعرف لو الضغط نجح ولا لأ.
  • أي ضغط مكرر ممكن يعمل ضرر كبير لو السيرفر مش “Idempotent”.

ازاي تختبري ده في الـ API Testing؟

  1. ابعتي نفس الـ POST مرتين بنفس الـ Idempotency-Key.
  2. راقبي إن السيرفر:
    • ما يسجلش إلا موعد واحد.
    • يرجّع نفس الاستجابة في المرتين.
  3. ابعتي مرة تالتة بمفتاح مختلف ➜ لازم يسجل موعد جديد