← كل المقالات

كيفاش تختار HTTP Error Statuses بلا ما تخبي السبب الحقيقي

دليل باش تفرق بين 4xx و 5xx باستعمال مثال ديال album photo privé باش تعرف كيفاش client خاصو يتصرف.

  • rest-api
  • learning-series
فهاد المقال

الفلسفة ديال signalisation d’erreur

الـ HTTP status codes ماشي غير سميات، بل هما تعليمات للـ client. ملي كيكون 500 Internal Server Error كتعني أن السيرفر وقع ليه مشكل وماعرفش يتعامل مع الحالة. ولكن ملي كيكون 4xx كتعني أن الـ client هو اللي خاصو يبدل شي حاجة فـ request ديالو باش تنجح. ملي API كتجمع كاع errors فـ 500 ولا 400 generic، كتخلي الـ client عاجز باش يصلح المشكل بوحدو.

كيفاش نربطو المشاكل بـ Status Codes

400 كتخص request خاسرة وAPI تقدر تستعملها حتى للـ validation حسب contract؛ 422 مناسبة لمحتوى شكله صحيح ولكن ما يمكنش يتعالج. 401 كتقول credentials صحيحة ناقصة وكتحتاج WWW-Authenticate. 403 رفض من server، ما كتثبتش دائما أن login نجح. Privacy policy تقدر ترجع 404 للمورد اللي ما مسموحش تشوفو.

409 تضارب مع الحالة الحالية. إلا If-Match ما تحققش، رجع 412 Precondition Failed بلا ما تسمي كاع ETag mismatches بـ409. Version field اللي application كتراقبها تقدر تعطي 409 حسب contract.

مثال تطبيقي: Trace ديال album photo

السيناريو: client بغا يبدل تصويرة فـ album privé. ها كيفاش كيكون التعامل على حسب المشكل:

Requestالحالة فـ السيرفرStatus Codeتفاصيل Header/Bodyتصرف الـ Client
PATCH /photos/abc-123ID ماشي UUID صحيح400{"error": "Invalid ID format"}يصلح syntax ديال request
PATCH /photos/uuid-1Token سالا (expired)401WWW-Authenticate: Bearerيجدد token ولا يدخل من جديد
PATCH /photos/uuid-2User A بغا يبدل تصويرة ديال User B403 (أو 404){"error": "Access denied"}يحبس المحاولات
PATCH /photos/uuid-3التصويرة ما كايناش404{"error": "Photo not found"}يمسحها من cache local
PATCH /photos/uuid-4 + If-MatchETag mismatch412{"error":"Precondition failed"}GET → reconcile → retry
PATCH /photos/uuid-5Caption طويلة بزاف422{"field": "caption", "msg": "Too long"}يطلب من user ينقص النص
PATCH /photos/uuid-6مشكل فـ connection ديال DB500{"error": "Internal error"}يعاود request من بعد شوية

ملاحظات فـ التطبيق

ملي تكون كتكودي، ما ديرش catch (Exception e) وحدة وترجع 500 لكلشي. حاول تربط كل domain exception بالـ code ديالها المناسب.

مشكل: الحلقة المفرغة ديال 401/403 إلا وصل الـ client 401 خاصو يحاول يجدد token. ولكن إلا وصل 403 ما خاصوش يجدد token، حيت الهوية ديالو معروفة ولكن الصلاحية هي اللي ناقصة. إلا بقى كيجدد token على 403 غادي يدخل فـ loop ما كتساليش.

تمرين

السيناريو: كتصاوب API ديال مشاركة الملفات. واحد user بغا يلوح fichier فـ folder. وقعات هاد الحوايج:

  1. الـ folder ID تصيفط كـ string، ولكن السيستيم كيتسنى integer.
  2. الـ user مكونيكتي، ولكن folder مديور فيه “Read Only” للـ group ديالو.
  3. الـ user بغا يلوح fichier بسمية كاينا ديجا فـ داك folder، والقانون ديال business كيمنع التكرار.

السؤال: شنو هما HTTP status codes اللي خاص يرجعو فـ هاد 3 الحالات، وعلاش؟

الجواب:

  1. 400 Bad Request: حيت النوع ديال input غلط من ناحية syntax بالنسبة لـ identifier اللي كنتسناو.
  2. 403 Forbidden: حيت user authenticated، ولكن action ديال الكتابة ممنوعة بـ permissions ديال resource.
  3. 409 Conflict: حيت request ماقدراتش تكمل بسباب الحالة الحالية ديال resource (كاين ملف بنفس السمية).

باش تزيد تفهم