رمز الحالة 428: الشرط المسبق مطلوب - مانع التحديثات المفقودة

INEZA Felin-Michel

INEZA Felin-Michel

21 أكتوبر 2025

رمز الحالة 428: الشرط المسبق مطلوب - مانع التحديثات المفقودة

Apidog للمؤسسات

النشر على الخوادم المحلية

SSO و RBAC

متوافق مع SOC 2

استكشف Apidog للمؤسسات

أنت تتعاون في مستند مهم مع زميل باستخدام محرر مستندات قائم على الويب. تفتحان المستند نفسه في الوقت نفسه. تقضي 30 دقيقة في إعادة كتابة المقدمة بعناية بينما يعمل زميلك على الخاتمة. تنقر على "حفظ" أولاً، ويتم قبول تغييراتك. ثم ينقر زميلك على "حفظ" ويقوم إصداره بالكتابة فوق مقدمتك الجديدة الرائعة بالكامل دون أي تحذير. لقد وقع عملك للتو ضحية "مشكلة التحديث المفقود".

هذا السيناريو المحبط هو بالضبط ما تم تصميم رمز حالة HTTP **428 Precondition Required** لمنعه. إنه أحد رموز الحالة الأكثر تطوراً واستباقية في مواصفات HTTP، ويعمل كآلية حماية للموارد التي قد يتم تعديلها بواسطة عدة مستخدمين في وقت واحد.

إنه ليس من الرموز الشائعة، ومع ذلك، فإنه يلعب دورًا بالغ الأهمية في **اتصالات API الآمنة والموثوقة والمتزامنة**.

إذًا، ماذا يعني بالضبط رمز حالة HTTP **428 Precondition Required**؟ متى يظهر، وكيف يمكنك التعامل معه بشكل صحيح؟

فكر في الأمر كأمين مكتبة حذر لن يسمح لك باستعارة كتاب حتى تؤكد أنك تعرف أي إصدار تقوم بتحديثه. إنها طريقة الخادم للقول: "أحتاج منك أن تثبت أنك تعمل بأحدث إصدار من هذا المورد قبل أن أسمح لك بإجراء التغييرات".

إذا كنت تقوم ببناء تطبيقات تعاونية، أو واجهات برمجة تطبيقات (APIs) تتعامل مع التحديثات المتزامنة، أو أي نظام تكون فيه اتساق البيانات أمرًا بالغ الأهمية، فإن فهم 428 ضروري.

هذا بالضبط ما سنقوم بتفصيله في هذا الغوص العميق، حتى تتمكن من فهم ليس فقط *ماذا* يعني 428، بل *لماذا* يوجد و*كيف* يمكنه تحسين واجهات برمجة التطبيقات الخاصة بك.

💡
إذا كنت تقوم ببناء أو اختبار واجهات برمجة التطبيقات (APIs) التي تحتاج إلى التعامل مع الوصول المتزامن بأمان، فأنت بحاجة إلى أداة يمكن أن تساعدك في محاكاة هذه السيناريوهات المعقدة. قم بتنزيل Apidog مجانًا؛ إنها منصة API شاملة تسهل اختبار الطلبات الشرطية باستخدام ETags والرؤوس، مما يضمن أن تطبيقك يمكنه التعامل مع استجابات 428 بشكل صحيح.
button

الآن، دعنا نستكشف كيف يحل رمز HTTP 428 Precondition Required مشكلة التحديثات المتضاربة.

المشكلة: التحديث المفقود المخيف

لفهم سبب وجود 428، نحتاج إلى تقدير المشكلة التي يحلها. في الأنظمة متعددة المستخدمين، عندما يحاول شخصان أو أكثر تحديث نفس المورد في نفس الوقت تقريبًا، قد تواجه العديد من المشكلات:

  1. التحديثات المفقودة: المشكلة الكلاسيكية حيث تقوم الكتابة الثانية بالكتابة فوق الأولى دون دمج تغييراتها.
  2. التغييرات المتضاربة: يقوم مستخدمان بإجراء تغييرات مختلفة على أجزاء مختلفة من نفس المورد.
  3. تحديثات البيانات القديمة: يقوم المستخدم بإجراء تغييرات بناءً على معلومات قديمة.

غالبًا ما تعتمد الأساليب التقليدية على قيام العميل "بالتصرف الصحيح" عن طريق تضمين رؤوس شرطية. ولكن ماذا لو نسي العميل؟ يسمح رمز 428 للخادم بفرض السلوك الجيد.

ماذا يعني HTTP 428 Precondition Required في الواقع؟

يشير رمز الحالة 428 Precondition Required إلى أن الخادم الأصلي يتطلب أن يكون الطلب مشروطًا. إنها طريقة الخادم لفرض أن العميل يجب أن يتضمن رؤوسًا شرطية (مثل If-Match أو If-Unmodified-Since) لإثبات أنه يعمل ببيانات حديثة.

يجب أن يتضمن الرد شرحًا مفيدًا لما هو الشرط المسبق المطلوب. يبدو رد 428 النموذجي كالتالي:

HTTP/1.1 428 Precondition RequiredContent-Type: application/problem+json
{
  "type": "<https://example.com/probs/conditional-required>",
  "title": "Precondition Required",
  "detail": "This resource requires conditional requests. Please include an If-Match or If-None-Match header.",
  "instance": "/articles/123"
}

الخادم يقول أساسًا: "بالنسبة لهذا المورد المحدد، لن أقبل التحديثات العمياء. تحتاج إلى أن تثبت لي أنك تعرف أي إصدار تحاول تعديله."

بمعنى أبسط، يتوقع الخادم من العميل تضمين **رأس شرط مسبق** مثل If-Match أو If-Unmodified-Since قبل أن يكون مستعدًا لمعالجة الطلب.

إذا لم يتم تضمين هذا الشرط المسبق، سيرفض الخادم الطلب ويرد بخطأ **428 Precondition Required**.

تعريف RFC الرسمي

تم تعريف **رمز الحالة 428** في **RFC 6585**، والذي قدم العديد من رموز حالة HTTP الإضافية لتحسين اتصالات الويب وموثوقيتها.

إليك ما يقوله:

“يشير رمز الحالة 428 (Precondition Required) إلى أن الخادم الأصلي يتطلب أن يكون الطلب مشروطًا. والغرض منه هو منع مشكلة "التحديث المفقود"، حيث يقوم العميل بجلب حالة مورد، ويعدلها، ثم يعيدها إلى الخادم، بينما يكون طرف ثالث قد عدل المورد في هذه الأثناء.”

هذا الكثير من المصطلحات التقنية، لكن الجوهر بسيط، إنه يتعلق بـ **سلامة البيانات** و**تجنب الكتابة فوقها** عندما يقوم عدة عملاء بتعديل نفس المورد في وقت واحد.

شرحها بلغة بسيطة

تخيل هذا السيناريو:

أنت تقوم بتحرير مستند في Google Docs مع زملائك. تفتح المستند، وتجري بعض التعديلات، وتنقر على **حفظ** ولكن في هذه الأثناء، قام زميلك أيضًا بإجراء تغييرات وحفظ إصداره قبلك.

الآن، بدون التحكم في الإصدارات، ستقوم تغييراتك بالكتابة فوق تغييراتهم. هذا بالضبط ما يساعد رمز الحالة **428 Precondition Required** على منعه في واجهات برمجة التطبيقات.

إنه يخبر العملاء:

“قبل أن تعدل هذا المورد، أثبت لي أنك تعمل على أحدث إصدار.”

لماذا تم تقديم 428؟

في واجهات برمجة التطبيقات RESTful وعمليات HTTP العامة، قد يقوم العملاء بقراءة مورد، وإجراء بعض التعديلات محليًا، ثم إرسال طلب تحديث. ومع ذلك، إذا تغير المورد في هذه الأثناء، فإن تطبيق التحديث بشكل أعمى يخاطر بالكتابة فوق التغييرات الأحدث.

من خلال مطالبة العملاء بتحديد شروط مسبقة، تضمن الخوادم ما يلي:

هذا أمر بالغ الأهمية لواجهات برمجة التطبيقات التي تدعم العمليات المتزامنة أو المستخدمين المتعددين.

كيف يعمل: تدفق الطلب الشرطي

دعنا ننتقل عبر مثال كامل لكيفية مساعدة 428 في منع التحديثات المفقودة في سيناريو التحرير التعاوني.

الخطوة 1: المستخدم أ يجلب المورد

يسترد المستخدم أ المستند الحالي:

GET /documents/123 HTTP/1.1

يستجيب الخادم بالمستند ويتضمن رأس **ETag** — وهو معرف فريد لهذا الإصدار المحدد من المورد:

HTTP/1.1 200 OKContent-Type: application/jsonETag: "abc123"
{
  "id": 123,
  "title": "Project Proposal",
  "content": "Original content...",
  "version": "abc123"
}

الخطوة 2: المستخدم ب يجلب نفس المورد

في نفس الوقت تقريبًا، يطلب المستخدم ب المستند أيضًا ويحصل على نفس ETag.

الخطوة 3: المستخدم أ يحاول التحديث (بدون شرط)

يحاول المستخدم أ تحديث المستند ولكنه ينسى تضمين رأس شرطي:

PUT /documents/123 HTTP/1.1Content-Type: application/json
{
  "id": 123,
  "title": "Project Proposal",
  "content": "User A's updated content...",
  "version": "abc123"
}

الخطوة 4: استجابة الخادم 428

نظرًا لأن نقطة النهاية هذه مهيأة لتتطلب شروطًا مسبقة، يستجيب الخادم بما يلي:

HTTP/1.1 428 Precondition RequiredContent-Type: application/json
{
  "error": "precondition_required",
  "message": "This resource requires conditional updates. Please include an If-Match header with the current ETag."
}

الخطوة 5: المستخدم أ يعيد المحاولة بالرأس الصحيح

يرى تطبيق المستخدم أ استجابة 428 ويعيد المحاولة تلقائيًا باستخدام الرأس الشرطي الصحيح:

PUT /documents/123 HTTP/1.1Content-Type: application/jsonIf-Match: "abc123"
{
  "id": 123,
  "title": "Project Proposal",
  "content": "User A's updated content...",
  "version": "abc123"
}

يعالج الخادم هذا الطلب الشرطي بنجاح ويعيد 200 OK مع ETag جديد.

الخطوة 6: المستخدم ب يحاول تحديثه

عندما يحاول المستخدم ب التحديث باستخدام ETag القديم الخاص به، يمكن للخادم الآن رفضه بـ 412 Precondition Failed، مما يمنع التحديث المفقود.

428 مقابل 412 Precondition Failed: فهم الفرق

هذا تمييز حاسم في عالم الطلبات الشرطية:

تشبيه:

لماذا يوجد 428 Precondition Required

للوهلة الأولى، قد يبدو الأمر مزعجًا. لماذا لا ندع العملاء يحدثون بحرية؟

حسنًا، حالة 428 موجودة لسبب وجيه: **لمنع فقدان البيانات** و**ضمان الاتساق** في الأنظمة الموزعة.

دعنا نستكشف غرضها بمزيد من التفصيل.

1. منع التحديثات المفقودة

تحدث مشكلة "التحديث المفقود" عندما يقوم عدة عملاء بجلب نفس المورد وتحديثه بشكل مستقل. بدون شروط مسبقة، قد يقوم تحديث أحد العملاء بالكتابة فوق تحديث آخر بصمت.

يضمن 428 أن كل تعديل يتحقق مما إذا كان المورد قد تغير منذ جلبه، مما يمنع فقدان البيانات بصمت.

2. ضمان سلامة البيانات

من خلال طلب شروط مسبقة مثل If-Match، يضمن الخادم أن التحديثات يتم تطبيقها فقط على الإصدار الصحيح من المورد. إنه مثل وضع قفل أمان على بياناتك.

3. تعزيز التزامن الآمن

في الأنظمة التي يتفاعل فيها العديد من المستخدمين مع الموارد المشتركة - مثل التحرير التعاوني، أو تكامل واجهات برمجة التطبيقات (API)، أو خدمات RESTful - يجعل 428 إدارة التزامن أكثر قابلية للتنبؤ وأمانًا.

4. تشجيع أفضل الممارسات

من خلال فرض الطلبات الشرطية، يحث الخادم المطورين على اتباع **أفضل ممارسات تصميم RESTful** مثل استخدام **ETags**، و**طلبات GET الشرطية**، و**فحوصات الإصدارات**.

متى تستخدم 428 Precondition Required

يجب أن تفكر في استخدام 428 في هذه السيناريوهات:

1. تطبيقات التحرير التعاوني

تطبيقات على غرار Google Docs حيث قد يقوم عدة مستخدمين بتحرير نفس المستند في وقت واحد.

2. الموارد عالية التنافس

أي مورد يشهد تحديثات متكررة من مصادر متعددة، مثل:

3. تحديثات البيانات الحساسة

الموارد التي قد تكون فيها الكتابة فوق البيانات عن طريق الخطأ ذات عواقب وخيمة، مثل السجلات المالية أو البيانات الطبية.

4. تصميم API للسلامة

عندما تريد فرض سلوك جيد للعميل ومنع مشكلات التزامن الشائعة.

سيناريوهات واقعية لـ 428 Precondition Required

1. تحرير API المتزامن

عندما يقوم عدة عملاء بتعديل نفس السجل في وقت واحد، يضمن 428 أن التحديثات لا تكتب فوق بعضها البعض.

2. واجهات برمجة التطبيقات ذات الإصدارات (Versioned APIs)

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

3. أنظمة القفل التفاؤلي (Optimistic Locking Systems)

تعتمد قواعد البيانات أو واجهات برمجة التطبيقات REST التي تستخدم **ETags** للتحكم في التزامن التفاؤلي على الشروط المسبقة لاكتشاف التعارضات.

4. واجهات برمجة تطبيقات تخزين الملفات أو الكائنات (File or Object Storage APIs)

تستخدم أنظمة التخزين السحابي مثل S3 الطلبات الشرطية بكثافة، وسيكون 428 مناسبًا طبيعيًا لفرض مثل هذه القواعد.

اختبار واجهات برمجة التطبيقات باستخدام Apidog

مواد ترويجية لـ Apidog

عند التعامل مع التحكم في التزامن، يصبح **Apidog** سلاحك السري. يتطلب اختبار تدفقات الطلبات الشرطية إعدادًا دقيقًا وخطوات متعددة. Apidog مناسب تمامًا لهذا النوع من الاختبار.

باستخدام Apidog، يمكنك:

button

أفضل ممارسات التنفيذ

لمطوري الخوادم:

لمطوري العملاء:

الصورة الأكبر: بناء واجهات برمجة تطبيقات قوية

يمثل رمز الحالة 428 Precondition Required تحولًا نحو واجهات برمجة تطبيقات أكثر قوة وتوثيقًا ذاتيًا. من خلال مطالبة العملاء باستخدام الطلبات الشرطية، أنت تقوم بما يلي:

  1. منع فقدان البيانات: القضاء على فئات كاملة من أخطاء التزامن
  2. تحسين أمان API: جعل الأمر أكثر صعوبة على العملاء لإتلاف البيانات عن طريق الخطأ
  3. فرض أفضل الممارسات: توجيه العملاء نحو أنماط الاستخدام الصحيحة
  4. توفير تشخيصات أفضل: تقديم ملاحظات واضحة عندما يرتكب العملاء أخطاء

الخلاصة: من معالجة الأخطاء التفاعلية إلى الاستباقية

يحول رمز حالة HTTP 428 Precondition Required التحكم في التزامن من أفضل ممارسة اختيارية إلى متطلب قابل للتنفيذ. إنه ينقل معالجة الأخطاء من كونها تفاعلية ("تحديثك تعارض مع تحديث شخص آخر") إلى استباقية ("تحتاج إلى إثبات أنك تعمل ببيانات حالية قبل أن أنظر حتى في تحديثك").

بينما قد يبدو الأمر كخطوة إضافية، إلا أن هذا النهج يؤدي في النهاية إلى تطبيقات أكثر موثوقية ومستخدمين أكثر سعادة لا يفقدون عملهم بسبب تلف البيانات الصامت.

بالنسبة للمطورين الذين يبنون تطبيقات ويب حديثة، يعد فهم وتطبيق 428 علامة على التطور في تصميم واجهة برمجة التطبيقات. إنه يظهر أنك لا تفكر فقط فيما تفعله واجهة برمجة التطبيقات الخاصة بك، بل كيف تتصرف في ظروف العالم الحقيقي مع عدة مستخدمين.

وعندما تكون مستعدًا لتطبيق واختبار ضوابط التزامن المتطورة هذه، توفر أداة قوية مثل **Apidog** بيئة الاختبار التي تحتاجها لضمان عمل منطق طلبك الشرطي بشكل لا تشوبه شائبة، مما يحمي بيانات المستخدمين وسلامتهم.

button

ممارسة تصميم API في Apidog

اكتشف طريقة أسهل لبناء واستخدام واجهات برمجة التطبيقات