كيفاش تختار HTTP Error Statuses بلا ما تخبي السبب الحقيقي
واجهات البرمجة والويبدليل باش تفرق بين 4xx و 5xx باستعمال مثال ديال album photo privé باش تعرف كيفاش client خاصو يتصرف.
فهاد المقال
الفلسفة ديال 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-123 | ID ماشي UUID صحيح | 400 | {"error": "Invalid ID format"} | يصلح syntax ديال request |
PATCH /photos/uuid-1 | Token سالا (expired) | 401 | WWW-Authenticate: Bearer | يجدد token ولا يدخل من جديد |
PATCH /photos/uuid-2 | User A بغا يبدل تصويرة ديال User B | 403 (أو 404) | {"error": "Access denied"} | يحبس المحاولات |
PATCH /photos/uuid-3 | التصويرة ما كايناش | 404 | {"error": "Photo not found"} | يمسحها من cache local |
PATCH /photos/uuid-4 + If-Match | ETag mismatch | 412 | {"error":"Precondition failed"} | GET → reconcile → retry |
PATCH /photos/uuid-5 | Caption طويلة بزاف | 422 | {"field": "caption", "msg": "Too long"} | يطلب من user ينقص النص |
PATCH /photos/uuid-6 | مشكل فـ connection ديال DB | 500 | {"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. وقعات هاد الحوايج:
- الـ folder ID تصيفط كـ string، ولكن السيستيم كيتسنى integer.
- الـ user مكونيكتي، ولكن folder مديور فيه “Read Only” للـ group ديالو.
- الـ user بغا يلوح fichier بسمية كاينا ديجا فـ داك folder، والقانون ديال business كيمنع التكرار.
السؤال: شنو هما HTTP status codes اللي خاص يرجعو فـ هاد 3 الحالات، وعلاش؟
الجواب:
400 Bad Request: حيت النوع ديال input غلط من ناحية syntax بالنسبة لـ identifier اللي كنتسناو.403 Forbidden: حيت user authenticated، ولكن action ديال الكتابة ممنوعة بـ permissions ديال resource.409 Conflict: حيت request ماقدراتش تكمل بسباب الحالة الحالية ديال resource (كاين ملف بنفس السمية).