الخادم استلم الـ headers وعلى العميل متابعة إرسال الجسم.
مرجع HTTP Status
مرجع كامل لكل أكواد HTTP بالعربية + الأسباب
1xx — معلوماتية
الطلب استُلم والمعالجة مستمرة
الخادم يوافق على تبديل البروتوكول (مثل HTTP إلى WebSocket).
WebDAV — الطلب يحتاج وقتاً للمعالجة.
2xx — نجاح
الطلب نُفّذ بنجاح
الطلب نجح والاستجابة تحوي البيانات المطلوبة.
الطلب نجح وتم إنشاء مورد جديد.
الطلب قُبل لكن لم يُعالَج بعد.
نجح الطلب لكن لا توجد بيانات للإرجاع.
تم إرجاع جزء من المورد (Range request).
3xx — إعادة توجيه
يحتاج إجراء إضافي لإكمال الطلب
المورد انتقل دائماً إلى URL جديد. المتصفحات تخزّن هذا الـ redirect.
إعادة توجيه مؤقتة — لا تُخزَّن.
المورد لم يتغير منذ آخر زيارة — استخدم الـ cache.
مثل 302 لكن يحافظ على HTTP method الأصلي.
مثل 301 لكن يحافظ على method.
4xx — خطأ من العميل
خطأ في الطلب من جهة العميل
الطلب مشوّه أو ينقصه parameters مطلوبة.
يحتاج تسجيل دخول — التوكن مفقود أو منتهٍ.
أنت مُصادَق لكن لا تملك الصلاحية.
المورد غير موجود في هذا الـ URL.
الـ URL موجود لكن لا يدعم هذا الـ HTTP method.
الطلب يتعارض مع حالة المورد الحالية.
المورد كان موجوداً لكن حُذف دائماً.
حجم الطلب يتجاوز حد الخادم.
Content-Type غير مدعوم من الـ endpoint.
JSON صحيح لكن validation فشل (Laravel/Rails يستخدمونه).
تجاوزت rate limit. أعِد Retry-After header.
5xx — خطأ من الخادم
الخادم فشل في تنفيذ طلب صالح
خطأ غير متوقع في الخادم — bug أو unhandled exception.
الخادم لا يدعم هذا الـ HTTP method.
Reverse proxy تلقى رداً غير صالح من upstream.
الخادم down مؤقتاً (صيانة، overload).
Reverse proxy انتظر upstream طويلاً ولم يردّ.
دليل شامل
أكواد HTTP: من 200 إلى 599 — متى تستخدم كل واحد
دليل شامل لأكواد HTTP، الفروقات بين 4xx و 5xx، ومتى تستخدم 201 vs 200 vs 204 في APIs.
لماذا أكواد HTTP أهم من أن يحفظها مهندس API عشوائياً
كل طلب HTTP في الإنترنت ينتهي برقم من ثلاث خانات: 200،404، 500. هذا الرقم ليس مجرد ردّ تقني، بل هو عقد بين الخادم والعميل يقول بدقّة: «هذا ما حدث، وهذا ما يجب أن تفعله الآن». استخدام كود خاطئ — مثلاً إعادة 200 OK لطلب فشل — يكسر الـ caches، يُربك الـ monitoring، ويخدع الـ retry logic في المتصفحات و SDKs.
المعيار RFC 9110 الصادر من IETF يُعرّف كل الأكواد القياسية ضمن خمس فئات. هذه المقالة تستعرضها بالعربية مع متى تستخدم كل كود، الفروقات الخفيّة بين أكواد متشابهة، وأخطاء شائعة في تصميم REST APIs تكلّفك ساعات debugging لاحقاً.
الفئات الخمس: كل خانة أولى تحكي قصّة
الخانة الأولى من الكود تحدّد فئته. 1xx معلوماتية (الطلب استُلم والمعالجة مستمرة)، 2xx نجاح (الطلب نُفّذ)، 3xx إعادة توجيه (يحتاج إجراء إضافي)، 4xx خطأ من العميل (الطلب نفسه فيه مشكلة)، 5xx خطأ من الخادم (الطلب صالح لكن الخادم فشل).
هذا التقسيم ليس تجميلياً: المتصفحات و reverse proxies و CDNs تتعامل مع كل فئة بشكل مختلف. 5xx مثلاً تُحفَّز retry تلقائي في كثير من العملاء، بينما 4xx لا تُعاد لأنّ المشكلة في الطلب نفسه. Cloudflare يخزّن 200 و 301 لفترات طويلة بشكل افتراضي لكنه لا يخزّن 500 أبداً.
2xx: نجاح، لكن أيّ نجاح بالضبط؟
200 OK مقابل 201 Created مقابل 204 No Content
الفرق بين الثلاثة دقيق وحاسم. 200 OK للطلب الناجح الذي يُعيد بيانات (الغالبية العظمى لـ GET). 201 Createdمخصّص لـ POST الذي ينشئ مورداً جديداً، ويجب أن يُعاد معه Location header يحتوي URL المورد الجديد. أمّا 204 No Content فللعمليات التي نجحت ولا تحتاج إعادة أي بيانات: DELETE ناجح، PUT بدون response body، أو PATCH صامت.
خطأ شائع: إعادة 200 مع جسم فارغ بدل 204. هذا يكسر بعض الـ HTTP clients التي تحاول parse الجسم وتفشل في null. القاعدة: إذا لم يكن لديك ما تعيده، استخدم 204.
202 Accepted للعمليات غير المتزامنة
عندما يستلم الـ API طلباً ويضعه في queue للمعالجة لاحقاً (إرسال إيميل، توليد تقرير ثقيل، training لـ ML model)، فالكود الصحيح هو 202 Accepted. أعِد معه عادةً URL أو ID للاستعلام عن حالة المهمة. هذا النمط أساسي في any API يتعامل مع long-running jobs.
3xx: إعادة التوجيه — الفرق بين 301 و 302 و 307 و 308
هذه الأكواد الأربعة محور لخبط لا ينتهي. 301 Moved Permanentlyيقول إنّ المورد انتقل دائماً، والمتصفحات و SEO engines تخزّن الـ redirect وتحدّث الـ bookmarks. 302 Found يقول إنّها نقلة مؤقّتة — لا تخزّن.
المشكلة التاريخية: 301 و 302 لا يضمنان الحفاظ على HTTP method. متصفح كثيراً ما يُحوّل POST إلى GET بعدهما. لذا أضاف معيار HTTP الحديث 307 Temporary Redirectو 308 Permanent Redirect اللذين يحافظان على الـ method الأصلية بشكل صارم. القاعدة الحديثة: استخدم 308 للنقل الدائم في APIs، و 307 للنقل المؤقّت، واترك 301 و 302 لصفحات الويب التقليدية.
أمّا 304 Not Modified فقصة منفصلة: يُستخدم في conditional requests مع If-None-Match أو If-Modified-Since. الخادم يقول للعميل: «ما عندي جديد، استعمل النسخة المخزّنة عندك». توفير ضخم للـ bandwidth وللـ database queries.
4xx: أخطاء العميل — اختيار الكود الصحيح يوفّر ساعات دعم
401 Unauthorized مقابل 403 Forbidden
الفرق الأشهر في عالم HTTP. 401 يقول «أنت غير مُصادَق — لا أعرف من أنت»: التوكن مفقود، منتهٍ، أو غير صالح. الحلّ من جهة العميل: أعِد توجيهه لشاشة الدخول. أمّا 403 فيقول «أعرف من أنت لكنك لا تملك الصلاحية لهذا الإجراء»: المستخدم مسجَّل دخول لكن دوره (role) لا يسمح. الحلّ ليس إعادة دخول، بل عرض رسالة «ليس لديك صلاحية».
404 Not Found مقابل 410 Gone
404 يعني المورد غير موجود — قد يكون لم يوجد أصلاً، قد يعود يوماً. 410 Gone يقول صراحةً: «كان موجوداً ولن يعود». الفرق مهمّ لـ SEO: محرّكات البحث تزيل URLs التي تعطي 410 فوراً من الـ index، بينما تترك URLs الـ 404 لفترة أطول قبل إزالتها.
409 Conflict و 422 Unprocessable Entity
409 للحالات التي يتعارض فيها الطلب مع حالة المورد الحالية: تسجيل إيميل موجود، تحديث متزامن لنفس السجل، optimistic concurrency control يفشل. 422 — رغم أنّه ظهر أصلاً في WebDAV — تبنّاه Laravel و Rails و كثير من frameworks الحديثة لـ validation errors: الـ JSON صحيح بنيوياً لكن قيمه غير مقبولة (إيميل غير صالح، رقم خارج النطاق، حقل مطلوب فارغ).
429 Too Many Requests و دور Retry-After
عند تجاوز rate limit، أعِد 429 مع Retry-After header يحدّد بالثواني متى يمكن المحاولة مجدداً. عملاء HTTP الذكية (مثل axios-retry) تحترم هذا الـ header وتُؤخّر تلقائياً. بدونه، العميل قد يبدأ retry storm يفاقم المشكلة.
5xx: أخطاء الخادم — متى يكون 502 و 503 و 504؟
500 Internal Server Error هو الكود العام: شيء ما انكسر في الخادم ولا تعرف ماذا بالضبط. unhandled exception، null pointer، database connection lost. القاعدة الأمنية: سجّل stack trace كاملاً في logs الخادم، ولا تكشفه أبداً في الـ response — يكفي رسالة عامة "Something went wrong".
الأكواد الثلاثة التي تخلط بينها فرق-DevOps: 502 Bad Gatewayيعني reverse proxy (Nginx, Cloudflare, AWS ALB) استلم رداً غير صالح من الـ upstream — عادةً الـ backend مات أو رجع HTTP مكسور. 503 Service Unavailable يعني الخدمة غير متاحة مؤقّتاً عن قصد: صيانة، إعادة تشغيل، overload محسوس. أعِد Retry-After ليعرف العميل متى يحاول. 504 Gateway Timeout يعني الـ proxy انتظر الـ backend وانتهت المهلة بدون ردّ.
هذه الأكواد الثلاثة تأتي تقريباً دائماً من الـ infrastructure (Nginx، CDN، Load Balancer)، لا من كود تطبيقك. لو رأيتها في logs الـ proxy فابدأ التحقيق من upstream healthcheck.
أنماط تصميم REST API: متى تستخدم أيّ كود
القاعدة الذهبية في REST: اجعل الكود يصف ما حدث بدقّة، لا ما تشعر به. لو فشل validation فهو 422، ليس 400. لو المستخدم غير مسجَّل فهو 401، ليس 403. لو الطلب نجح بدون بيانات للإرجاع فهو 204، ليس 200 بجسم فارغ.
مثال على CRUD endpoint كامل: POST /users ينشئ مستخدماً → 201 + Location. GET /users/42→ 200 أو 404 إن لم يوجد. PUT /users/42ناجح بدون body → 204. DELETE /users/42→ 204. أمّا لو حاولت تسجيل إيميل مكرّر فـ 409، ولو أرسلت إيميل غير صالح فـ 422.
أثر الأكواد على Caching و Monitoring
المتصفحات و CDNs تخزّن استجابات بناءً على الكود. الافتراضي: 200، 203، 204، 206، 300، 301، 404، 405، 410، 414، 501 قابلة للتخزين (وفق RFC 9111). البقية لا تُخزَّن افتراضياً.
من جهة الـ monitoring: أي نظام تنبيه جيد يفصل بين 4xxو 5xx. 4xx غالباً bug في العميل أو سلوك مشروع (مستخدم يحاول الوصول لشيء غير موجود). 5xxتنبيه مباشر لفريق المنصة — كل 500 ينبغي أن يُسجَّل مع كامل الـ context. أدوات مثل Sentry و Datadog تتعامل مع هذين النوعين بشكل مختلف تماماً في الـ alerting rules.
الخلاصة: الكود الصحيح في المكان الصحيح
أكواد HTTP ليست تفاصيل ثانوية يمكن تجاهلها. كل كود تختاره يُملي سلوك المتصفحات، الـ CDNs، الـ retry logic، و dashboards الـ monitoring. اختيار 200 بدل 201قد يبدو تافهاً لكنّه يكسر معايير REST. اختيار 500بدل 503 يحرم نظامك من الـ retry-after الذكي.
ابدأ بحفظ الـ 15 كوداً الأكثر استخداماً (200, 201, 204, 301, 302, 304, 400, 401, 403, 404, 409, 422, 429, 500, 503)، وعُد لهذه المقالة عند تصميم أي endpoint جديد. المرجع التفاعلي أعلاه يخدمك كـ cheat sheet دائم.
استخدام الأكواد في تصميم APIs حديثة (REST و GraphQL و gRPC)
في REST التقليديّ، الأكواد هي طبقة العقد بينك وبين العميل. لكن مع انتشار GraphQL و gRPC، فهم متى تستعمل أيّاً منها يحدّد ما إذا كان فريقك يبني API احترافيّاً أم مجرّد wrapper فوق قاعدة بيانات. القاعدة العمليّة:
- REST — اعتمد كامل سلّم الأكواد.
POSTناجح ينشئ كياناً →201 CreatedمعLocationheader. تحديث جزئي →200أو204. خطأ تحقّق (validation) →422 Unprocessable Entityمع جسم يُفصّل الحقول الفاشلة. - GraphQL — يعيد دائماً
200 OKحتّى عند الأخطاء؛ الخطأ في حقلerrorsمن الجسم. لكن لو رفض الـ gateway الطلب كاملاً (مثلاً حدّ تعقيد التعليمات البرمجيّة)، أعد400أو429كالمعتاد. - gRPC — يستخدم أكواده الخاصّة (UNAVAILABLE, DEADLINE_EXCEEDED) لكنّ مدخل HTTP/2 يَترجمها لـ
503عند الإتاحة و504عند انتهاء المهلة. أدوات observability حديثة (OpenTelemetry, Datadog APM) تربط كود gRPC بكود HTTP لتسهيل الـ alerting.
توصية للفِرق السعوديّة التي تَبني على Spring Boot أو NestJS أو FastAPI: عرّف enum مركزيّ للأكواد المستعملة في مشروعك (لا تتجاوز عادة 20 كوداً)، و امنع الاستعمال الحرّ. هكذا تَحصل على تَلميحات IDE، unit tests يَفحص الكود الصحيح، و توثيق OpenAPI متّسق. Stripe و GitHub يَنشران علناً قائمة أكوادهما — اقرأها مرّة و اقتدِ بها.
أدوات ذات صلة
أدوات أخرى مجانية على ArabToolBox، كلها تعمل في متصفّحك بدون تسجيل.
- مولّد Cron Expressionsابنِ تعبيرات Cron بصرياً + شرح بالعربية
- اختبار Regexاختبر Regex على نصوص عربية وإنجليزية — مع شرح
- منسّق JSONتنسيق وتحقق JSON مع مقارنة Diff وتحويل لـ CSV/YAML
- مولّد UUIDولّد UUID/GUID بإصدارات متعددة — دفعات حتى 1000
- Base64 ترميز وفكترميز وفك Base64 — نصوص، صور، ملفات — محلياً 100%
- ترميز URLترميز URL مع دعم كامل للأحرف العربية + Query Strings
أسئلة شائعة
ما الفرق بين 401 Unauthorized و 403 Forbidden؟
401 يعني «أنت غير مُصادَق — لا أعرف من أنت»: التوكن مفقود أو منتهٍ أو غير صالح. الحلّ من جهة العميل: إعادة توجيه لشاشة الدخول. أمّا 403 فيعني «أعرف من أنت لكنك لا تملك الصلاحية»: المستخدم مسجّل دخول لكن دوره لا يسمح بهذا الإجراء. الحلّ ليس إعادة دخول بل عرض رسالة «ليس لديك صلاحية». الخلط بينهما يُربك UX ويجعل المستخدم يدخل ويخرج بلا فائدة.
متى أستخدم 200 OK مقابل 201 Created مقابل 204 No Content؟
200 للطلب الناجح الذي يُعيد بيانات (الغالبية العظمى لـ GET). 201 مخصّص لـ POST الذي ينشئ مورداً جديداً، ويُفضَّل إرفاق Location header يحتوي URL المورد الجديد. 204 للعمليات التي نجحت ولا تحتاج إعادة أي بيانات: DELETE ناجح، PUT بدون response body، أو PATCH صامت. القاعدة: إذا لم يكن لديك ما تعيده، استخدم 204 ولا تُعِد 200 بجسم فارغ — فبعض عملاء HTTP تحاول parse الجسم وتفشل.
ما الفرق بين 301 و 302 و 307 و 308؟
301 و 302 موروثان من معيار قديم ولا يضمنان الحفاظ على HTTP method (كثيراً ما يتحول POST إلى GET بعدهما في المتصفحات). أضاف معيار HTTP الحديث 307 Temporary Redirect و 308 Permanent Redirect اللذين يحافظان على الـ method الأصلية بشكل صارم. القاعدة الحديثة لـ APIs: استخدم 308 للنقل الدائم و 307 للنقل المؤقّت، واترك 301 و 302 لصفحات الويب التقليدية. 301 و 308 كلاهما يقولان «دائم» (SEO و bookmark caching)، و 302 و 307 كلاهما «مؤقّت».
ما الفرق بين 502 و 503 و 504؟
هذه الأكواد الثلاثة تأتي من الـ infrastructure (Nginx، CDN، Load Balancer)، لا من كود تطبيقك عادةً. 502 Bad Gateway: reverse proxy استلم رداً غير صالح من الـ upstream — الـ backend مات أو رجع HTTP مكسور. 503 Service Unavailable: الخدمة غير متاحة مؤقّتاً عن قصد (صيانة، إعادة تشغيل) — أعِد معه Retry-After header. 504 Gateway Timeout: الـ proxy انتظر الـ backend وانتهت المهلة بدون ردّ. لو رأيت أيّاً منها في logs الـ proxy فابدأ التحقيق من upstream healthcheck.
هل 422 Unprocessable Entity جزء من معيار HTTP القياسي؟
نعم. ظهر أصلاً في WebDAV (RFC 4918) ثم تبنّاه RFC 9110 ضمن معيار HTTP العام عام 2022. تستخدمه frameworks حديثة (Laravel، Rails، FastAPI) لـ validation errors: الـ JSON صحيح بنيوياً لكن قيمه غير مقبولة — إيميل غير صالح، رقم خارج النطاق، حقل مطلوب فارغ. الفرق عن 400 Bad Request: 400 للطلب المكسور نحويّاً (JSON غير صالح، header مفقود)، 422 للطلب الصحيح نحويّاً لكن غير قابل للمعالجة منطقيّاً.
كيف أتعامل مع 429 Too Many Requests في API الخاص بي؟
عند تجاوز rate limit، أعِد 429 مع Retry-After header يحدّد بالثواني متى يمكن المحاولة مجدداً (مثلاً Retry-After: 60). عملاء HTTP الذكية مثل axios-retry و urllib3 تحترم هذا الـ header وتُؤخّر تلقائياً. بدونه، العميل قد يبدأ retry storm يفاقم المشكلة. أضِف أيضاً headers مفيدة: X-RateLimit-Limit (الحدّ الأقصى)، X-RateLimit-Remaining (المتبقّي)، X-RateLimit-Reset (وقت إعادة التعيين كـ Unix timestamp).
قراءات ذات صلة
مقالات وأدلّة مرتبطة بنفس الموضوع على ArabToolBox.
أدوات قد تهمّك
مولّد Cron Expressions
ابنِ تعبيرات Cron بصرياً + شرح بالعربية
أمان وتقنيةاختبار Regex
اختبر Regex على نصوص عربية وإنجليزية — مع شرح
أمان وتقنيةمنسّق JSON
تنسيق وتحقق JSON مع مقارنة Diff وتحويل لـ CSV/YAML
أمان وتقنيةمولّد UUID
ولّد UUID/GUID بإصدارات متعددة — دفعات حتى 1000
أمان وتقنيةBase64 ترميز وفك
ترميز وفك Base64 — نصوص، صور، ملفات — محلياً 100%
أمان وتقنيةترميز URL
ترميز URL مع دعم كامل للأحرف العربية + Query Strings