سرفصل‌های آموزشی
آموزش RESTful API
درآمدی بر مفهوم Idempotent در توسعهٔ RESTful API

درآمدی بر مفهوم Idempotent در توسعهٔ RESTful API

در پروسهٔ توسعهٔ RESTful API زمانی که چندین ریکوئست‌ مشابه تأثیری یکسان با تنها یکی از آن ریکوئست‌ها داشته باشد، گفته می‌شود که سرویس مذکور اصطلاحاً Idempotent است.

واقعیت امر آن است که وقتی دست به توسعهٔ RESTful API می‌زنیم، می‌باید این نکته را مد نظر داشته باشیم توسعه‌دهندگانی که از وب سرویس‌مان استفاده می‌کنند ممکن است مرتکب خطا شوند. به طور مثال، این احتمال وجود دارد که توسعه‌دهنده‌ای کدی زده باشد که در سمت کلاینت چندین و چندین ریکوئست مشابه به سمت سرور ارسال کند در حالی که فقط اولین ریکوئست نیازش را مرتفع خواهد ساخت که در چنین شرایطی، ما به عنوان توسعه‌دهندهٔ ای‌پی‌آی، می‌باید جلوی هر گونه ریکوئست مشابهی را بگیریم که ممکن است سیستم را بی‌ثبات سازد.

منظور از یک ریکوئست Idempotent چیست؟

به طور کلی، چنانچه یک درخواست از جنس HTTP چندین و چند دفعه پشت سر هم فراخوانی شود، نتایج تمامی آن‌ها یکسان خواهد بود و درخواست‌های اضافی منجر به تغییر در وضعیت پاسخ‌های دریافتی نخواهند شد. به عبارتی،‌ خواه یک بار درخواستی را به سمت سرور ارسال کنیم و خواه چند بار، نتیجه یکسان خواهد بود تا جایی که می‌توان گفت نتیجهٔ یک ریکوئست موفقیت‌آمیز مستقل از تعداد دفعاتی است که آن ریئکوست اجرا می‌گردد.

با پیروی کردن از اصول توسعهٔ RESTful API، متدهایی از جنس PUT ،GET و DELETE به صورت خودکار Idempotent هستند اما این در حالی است که متد POST از این خصیصه برخوردار نیست که در ادامه این موضوع را بیشتر مورد بررسی قرار خواهیم داد.

معمولاً از متد POST به منظور ایجاد یک ریسورس جدید استفاده می‌شود و زمانی که یک ریکوئست از این جنس را چند بار پشت سر هم به سمت سرور ارسال می‌کنیم، به همان تعداد ریسورس جدید ایجاد می‌گردد و روی همین حساب هم می‌گوییم که این متد Idempotent نیست. در مقابل، متدهایی همچون OPTIONS ،HEAD ،GET و ... تحت هیچ عنوان وضعیت ریسورس را در سمت سرور تغییر نمی‌دهند بلکه صرفاً به منظور فراخوانی دیتا می‌توانند مورد استفاده قرار گیرند و به طور مثال تکرار چند درخواست از جنس GET منجر به تغییر روی دیتای ذخیره‌شده در سمت سرور نمی‌گردد.

متد PUT هم معمولاً به منظور آپدیت دیتا مورد استفاده قرار می‌گیرد و اگر N دفعه درخواستی از این جنس را فراخوانی کنیم، صرفاً اولین درخواست ارسالی به سمت سرور منجر به آپدیت ریسورس مد نظر شده و دیگر درخواست‌هایی که در ادامه ارسال می‌شوند (N-1) صرفاً منجر به اُورراید (بازنویسی) وضعیت ریسورس شده و در عمل منجر به تغییر چیزی نمی‌شوند و از همین روی هم می‌توان گفت که متد PUT نیز Idempotent است.

زمانی هم که متد DELETE را بارها تکرار کنیم، اولین ریکوئست منجر به حذف ریسورس شده و کد وضعیتی همچون 200 در معرض دیدمان قرار می‌گیرد و دیگر ریکوئست‌ها (N-1) منجر به دریافت پاسخ 404 می‌شوند چرا که دیگر چنین ریسورسی وجود ندارد که بخواهیم آن را حذف کنیم و از همین روی متد DELETE نیز Idempotent است.

online-support-icon