مفاهیم مهم در HTTP Status Code

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

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

Status Codeهای سطح ۱۰۰

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

Status Codeهای سطح ۲۰۰

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

۲۰۰ OK

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

۲۰۱ Created

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

۲۰۲ Accepted

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

۲۰۴ No Content

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

Status Codeهای سطح ۳۰۰

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

۳۰۱ Moved Permanently

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

۳۰۲ Found

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

۳۰۴ Not Modified

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

Status Codeهای سطح ۴۰۰

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

۴۰۰ Bad Request

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

۴۰۱ Unauthorized

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

۴۰۳ Forbidden

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

۴۰۴ Not Found

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

۴۲۹ Too Many Requests

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

Status Codeهای سطح ۵۰۰

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

۵۰۰ Internal Server Error

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

۵۰۳ Service Unavailable

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

جمع‌بندی

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

دیدگاه‌ها:

افزودن دیدگاه جدید