هنگامی که با اینترنت کار می‌کنیم احتمالاً با برخی از status codeهای HTTP مانند status code 404 برخورد کرده‌ایم، اما این کدها فقط محدود به یک مورد نمی‌باشد. بیش از 50 نوع HTTP status code منحصربه‌فرد در پنج دسته مختلف وجود دارد. البته نیازی نیست که همه آن‌ها را به خاطر بسپاریم. در این مقاله قصد داریم تا هر یک از پنج بخش و همچنین مهم‌ترین status codeهای هر یک از آن بخش‌ها را باهم بررسی کنیم. با داشتن این اطلاعات می‌توانیم APIهای قوی‌تری بسازیم که HTTP status code مناسب را برمی‌گرداند و استفاده از آن را آسان‌تر می‌کند.

همچنین، به منظور دسترسی به لیست کاملی از HTTP status code همراه با توضیحات(از جمله مواردی که در این مقاله نیستند)، توصیه می‌کنیم HTTP status codes از MDN را مطالعه کنید.

Status Codeهای سطح 100

اولین سطح از status codeها، سطح 100 است اما هیچ یک از کدها آنقدر رایج و پرکاربرد نیستند که بخواهیم مفهوم آن‌ها را درک کنیم. تنها تعداد انگشت‌شماری در این بخش وجود دارد و هیچ کدام از آن‌ها برای توسعه وب معمولی و یا توسعه API مورد استفاده قرار نمی‌گیرند، بنابراین می‌توانیم از کل این بخش صرف نظر کنیم.

Status Codeهای سطح 200

status codeهای سطح 200 رایج‌ترین status codeهای مورد استفاده می‌باشند، اما فقط چند مورد وجود دارد که دانستن آن‌ها اهمیت بسیار بالایی دارد. این status codeها برای نشان دادن پاسخ‌های موفق استفاده می‌شوند و هر زمان که درخواستی با موفقیت انجام شد باید return شوند.

200 OK

اولین کد، 200 است و بیانگر یک وضعیت موفقیت‌آمیز عمومی می‌باشد. این کد نشان می‌دهد هر درخواستی که در تلاش بود انجام شود با موفقیت‌ انجام شده است اما اطلاعات بیشتری از آن ارائه نمی‌دهد. به همین دلیل، زمانی که کد خاصی برای استفاده وجود ندارد 200 status وضعیت بازگشتی است که باید برای هر درخواست موفقیت آمیزی استفاده کنیم.

201 Created

کد مهم دیگری که در این بخش داریم کد 201 است. این یک کد موفقیت است که می‌گوید یک resource با موفقیت ایجاد شده است. اغلب ما این را به عنوان نتیجه یک درخواست POST خواهیم دید زیرا درخواست‌های POST بیشتر برای ایجاد چیزی مورد استفاده قرار می‌گیرند. به عنوان مثال، اگر یک مسیر API برای ایجاد یک ورودی جدید در پایگاه داده خود داریم، اگر آن ورودی با موفقیت ایجاد شود، باید کد 201 را return کنیم.

202 Accepted

status code 202 در اصل به این معنی است که پاسخ با موفقیت دریافت شده است، اما عمل واقعی درخواست (ایجاد resource، به‌روزرسانی داده‌ها و غیره) هنوز تکمیل نشده است. معمولاً زمانی استفاده می‌شود که انجام یک کار خاص بسیار آهسته است، بنابراین برای انجام ادامه کار در صف قرار می‌گیرد. به عنوان مثال، اگر ما نیاز به ایجاد یک گزارش بزرگ داریم تا برای یک کاربر ایمیل کنیم، می‌توانیم یک کد 202 را برگردانیم تا به مشتری اطلاع دهیم که در حال پردازش درخواست هستیم اما هنوز آن را به پایان نرسانده‌ایم.

204 No Content

یکی دیگر از کدهای پرکاربرد کد 204 است. به این معنی که درخواست با موفقیت انجام شده است، اما هیچ داده‌ای برای بازگشت وجود ندارد. این موضوع در درخواست‌های DELETE بسیار رایج است، زیرا معمولاً هیچ داده‌ای برای بازگشت به عنوان پاسخ به حذف چیزی وجود ندارد. بزرگ‌ترین کلید این status code این است که نمی‌تواند هیچ داده‌ای در بدنه خود داشته باشد.

Status Codeهای سطح 300

همه status codeهای سطح 300 در مورد تغییر مسیر هستند. به عنوان مثال، اگر صفحه‌ای به لوکیشن جدیدی منتقل شده است یا می‌خواهیم کاربر را به برخی از داده‌های ذخیره شده ری‌دایرکت کنیم، از یکی از status codeهای سطح 300 استفاده می‌کنیم.

301 Moved Permanently

احتمالاً رایج‌ترین status codeهای سطح 300 کد 301 است. این کد بیانگر این است صفحه‌ای که در یک URL خاص داشتیم به طور دائم به یک URL جدید منتقل شده است. این URL جدید باید در پاسخ با کد 301 ارسال شود. اگر این اتفاق بیفتد مرورگر به طور خودکار کاربران را به URL جدید ری‌دایرکت می‌کند. این کار همچنین باعث می‌شود که موتورهای جستجو همه داده‌های URL قدیمی را با URL جدید مرتبط کنند، بنابراین با انجام این کار، هیچ رتبه‌ای را در موتور جستجو از دست نمی‌دهیم.

302 Found

مشابه status 301، از این status برای اطلاع‌رسانی در مورد این که صفحه مورد نظر کاربر در یک URL جدید است، اما این یک تغییر موقت می‌باشد استفاده می‌شود. به این معنی که موتورهای جستجو URL قدیمی را با URL جدید جایگزین نمی‌کنند. این کار در صورتی مفید است که بخواهیم کاربر را به نسخه دیگری از همان صفحه بفرستیم، اما نمی‌خواهیم آن نسخه از صفحه جایگزین نسخه اصلی ما در موتورهای جستجو شود. برای مثال، اگر در حال انجام تست‌های A/B هستیم، نیمی از کاربران خود را به نسخه جایگزین سایت ری‌دایرکت می‌کنیم. این کار همچنین برای مواردی مانند بومی سازی که ممکن است بخواهیم کاربران را بر اساس جایی که در آنجا حضور دارند به نسخه‌های بومی‌سازی شده سایت خود هدایت کنیم مفید است.

304 Not Modified

آخرین status code سطح 300 کد 304 است. این کد برای ذخیره‌سازی استفاده می‌شود و فقط می‌گوید که منبع درخواست شده تغییر نکرده است. این کد باید همراه با یک درخواست status 200 قبلی که شامل هدرهای ذخیره‌سازی مانند Cache-Control و هدر Expires بود، مورد استفاده قرار بگیرد. هنگامی که یک کلاینت سعی می‌کند قبل از اتمام دوره زمانی ذخیره شده به منبعی دسترسی پیدا کند، سرور یک کد 304 برمی‌گرداند تا از ارسال مجدد همه داده‌ها به کلاینت جلوگیری کند.

Status Codeهای سطح 400

status codeهای سطح 400 بزرگ‌ترین بخش status codeهای HTTP را شامل می‌شود. status codeهای سطح 400 هر خطایی که به دلیل input کلاینت رخ داده باشد را نشان می‌دهد. به عنوان مثال، اگر کلاینت داده‌های بد یا ناقص به سرور ارسال کند.

400 Bad Request

status code 400 مشابه status code 200 است با این تفاوت که یک درخواست عمومی بد را نشان می‌دهد. به این معنی است که داده‌هایی که به request ارسال می‌شوند (پارامترهای URL، JSON و غیره) نادرست، ناقص، گم شده یا به نوعی توسط سرور غیرقابل استفاده هستند. این پیام status پیش‌فرض است که وقتی درخواستی داریم که به دلیل کلاینت قابل رسیدگی نیست، ارسال می‌شود. به عنوان مثال، اگر سعی کنیم درخواستی برای ایجاد یک کاربر جدید ارسال کنیم که شامل فیلد نام نمی‌باشد، در این صورت سرور یک status code 400 ارسال می‌کند تا به ما اطلاع دهد که فیلد نام ضروری است.

401 Unauthorized

status code 401 کمی گیج کننده است زیرا در حالی که از کلمه غیر مجاز استفاده می‌کند (به این معنی که ما مجوز نداریم) اما در واقع به این معنی است که ما احراز هویت نشده‌ایم. تفاوت اصلی این است که احراز هویت نکردن به این معنی است که ما وارد سیستم نشده‌ایم و یا اینکه سعی کرده‌ایم با اطلاعات نامعتبر وارد شویم. این موضوع ممکن است در صورتی اتفاق بیفتد که هنگام کار با APIها یک API key نامعتبر ارسال کنیم و یا اینکه اصلاً API key را نداشته باشیم.

403 Forbidden

هنگام برخورد با مجوزها باید از status code 403 استفاده کنیم. این status به کلاینت اطلاع می‌دهد که اجازه انجام درخواست مورد نظر را ندارد. status code 403 فقط در صورتی باید return شود که کلاینت مدارک معتبر (مانند یک API key معتبر) را ارسال می‌کند، اما فاقد مجوز برای انجام این عمل می‌باشد. به عنوان مثال، اگر یک کاربر اصلی سعی کند به داده‌های مدیریتی دسترسی پیدا کند، یک کد 403 return می‌کنیم.

404 Not Found

این کد رایج ترین HTTP status code است که مردم از آن آگاه هستند و به این معنی است که منبع مورد نظر پیدا نشد. برای مثال اگر بخواهیم به یک URL و یا به چیزی از پایگاه داده که وجود ندارد دسترسی پیدا کنیم، می‌توانیم از این کد استفاده کنیم.

429 Too Many Requests

آخرین کد مهم status codeهای سطح 400 کد 429 است. این کد هنگام برخورد با محدودیت استفاده می‌شود. به عنوان مثال، اگر به کاربران اجازه دهیم فقط 30 بار در دقیقه به API ما دسترسی داشته باشند و شخصی سعی کند 31 بار این کار را انجام دهد، یک status code 429 را return می‌کنیم تا کاربر بداند که باید منتظر بماند تا بتواند درخواست بعدی خود را ارسال کند. همچنین باید یک HTTP header با عنوان Retry-Afterهمراه با مدت زمان انتظار برای پذیرش درخواست‌ها توسط API داشته باشد.

Status Codeهای سطح 500

سطح نهایی status codeها، سطح 500 است و بسیار شبیه به سطح 400 می‌باشد. با این تفاوت که کدهای سطح 500 به جای خطاهای کلاینت با خطاهای موجود در سرور سروکار دارند.

500 Internal Server Error

تا کنون رایج‌ترین status code سطح 500، کد 500 است. این کد به کلاینت اطلاع می‌دهد که خطاهایی در سرور وجود دارد. این خطا می‌تواند ناشی از هر چیزی باشد، از خطاهای موجود در کد که منجر به از کار افتادن برنامه می‌شوند(حتی اگر این خطا به دلیل داده های مشتری بد باشد) تا مشکلات دسترسی به پایگاه داده. این کد باید در هر موقعیتی که سرور دارای خطا می‌باشد و کد خاصی وجود ندارد که قابل اجرا باشد مورد استفاده قرار بگیرد.

503 Service Unavailable

status codeهای سطح 500 دیگری که بخواهیم از آن‌ها استفاده کنیم زیاد نیستند اما کد 503 نیز تا حدودی رایج می‌باشد. این status code به این معنی است که سرور قادر به رسیدگی به درخواست نیست. هنگام انجام برخی از تعمیرات برنامه‌ریزی شده سرور از این مورد استفاده می‌شود، مثلا جایی که سرور در حین به‌روزرسانی از کار افتاده است. این کد همچنین باید شامل یک HTTP header با عنوان Retry-After  همراه با زمان تخمین زده شده تا زمان پشتیبان‌گیری سرور باشد.

جمع‌بندی

ممکن است بیش از 50 نوع HTTP status code وجود داشته باشد، اما تنها تعداد انگشت‌شماری وجود دارد که باید آن‌ها را درک کنیم. اگر از این status codeها آگاهی داشته باشیم، می‌توانیم یک API قوی ایجاد کنیم که استفاده از آن بسیار آسان باشد.