أثناء اختبار API أو endpoint عبر المتصفح، قد تعدل البيانات ثم ترى response قديمة. أحيانًا السبب server bug، وأحيانًا browser/CDN cache مع ETag و Cache-Control. التشخيص يحتاج النظر لل request headers و response status وعمر الاستجابة.
افهم ETag
ETag validator يمثل نسخة من resource. العميل قد يرسل If-None-Match، وإذا لم تتغير يرجع server 304 بدون body ويستخدم cache المحلية. إذا generation خاطئة قد تستمر نسخة قديمة.
اقرأ Cache-Control
max-age يحدد freshness، no-cache يعني revalidate وليس no-store، و no-store يطلب عدم التخزين. هذه الفروق مهمة في APIs الحساسة.
اختبر بدون Cache
استخدم DevTools Disable cache أو header مناسب في بيئة اختبار، ثم قارن. إذا اختفت المشكلة، راجع policy بدل إضافة query random في الإنتاج كحل دائم.
خطوات عملية
- سجل response headers.
- أعد الطلب طبيعيًا.
- أعده مع cache disabled.
- قارن Age/ETag/status.
انتبه ل ـCDN
قد يكون browser يطلب جديدًا لكن CDN يعيد cache. راجع Age و Via و cache status headers إن وجدت. purge أو cache key قد يكون السبب.
لا تكسر caching المفيد
إضافة no-store لكل API تمنع مشاكل الاختبار لكنها قد ترفع الحمل. حدد endpoints التي يجب أن تكون fresh دائمًا وأخرى يمكن cache مع validators.
اختبر mutations
بعد PUT/POST يغير resource، تحقق هل cache invalidated أو ETag تغيرت. هذا contract يجب أن يدخل integration tests.
قائمة مراجعة
- ETag قبل/بعد.
- 304 behavior.
- CDN status.
- browser cache.
راجع Cache Key مع Query و Headers والمستخدم
قد يكون ETag صحيحًا لكن CDN أو reverse proxy يبني cache key ناقصة فتعود استجابة مستخدم آخر أو parameter آخر. اختبر URL نفسها مع query values مختلفة و Accept-Language مختلف و Authorization أو Cookie حسب policy. راقب Vary و cache-status. الاستجابات المخصصة للمستخدم لا يجب أن تدخل shared cache إلا بتصميم واعٍ. أضف contract test: GET مع If-None-Match يرجع 304 قبل mutation، ثم بعد PUT ناجحة يجب أن يرجع 200 أو ETag جديدة. إذا بقي 304 رغم تغير المورد، لديك invalidation أو validator bug. هذا الاختبار يغطي freshness والعزل معًا بدل التركيز على زر Disable Cache في DevTools فقط.
قائمة مراجعة
- Query ضمن cache key عند الحاجة.
- Authenticated data لا تتسرب.
- Vary headers صحيحة.
- ETag تتغير بعد mutation.
راقب Stale-While-Revalidate إن كان مستخدمًا
سياسة stale-while-revalidate قد تعيد محتوى قديمًا عمدًا بينما تحدثه في الخلفية. عند الاختبار، اقرأ Cache-Control كاملًا ولا تعتبر كل response stale bug. سجل Age وانتظر إعادة التحقق ثم اطلب مرة أخرى. إذا endpoint لا يقبل stale data، لا تستخدم directive هناك حتى لو تحسن latency.
من المثال إلى تطبيق يمكن صيانته
في «ETag و Cache-Control: كيف تمنع اختبارات API من قراءة استجابة قديمة» جرّب الحل على حالة صغيرة ثم أضف failure path واضحًا واختبارًا آليًا يحمي السلوك المتوقع. حدّد contract للمدخلات والمخرجات، وتعامل مع القيم الناقصة قبل الوصول إلى طبقة التنفيذ. إذا كان الحل يتعامل مع API أو ملف أو DOM، أضف logging مختصرًا يوضح المرحلة وكود الخطأ دون بيانات حساسة. بعد ذلك اختبر التوافق مع نسخة سابقة أو بيئة مختلفة. هذه الخطوات تجعل المثال مفيدًا في مشروع حقيقي بدل أن يبقى snippet يعمل فقط في المسار المثالي.
قائمة مراجعة
- Contract للمدخلات والمخرجات.
- اختبار failure path.
- رسائل خطأ قابلة للتشخيص.
- Regression test قبل الدمج.
شارك في تقييم ونقاش المقال
رأيك يضيف قيمة للمقال ويساعدنا على تحسين المحتوى والنقاش حوله.
النقاش
جارٍ تحميل التعليقات…