رویکرد REST یکی از فراگیرترین روشها در طراحی و توسعه APIهای وب است. در معماری REST که بر پایه HTTP بنا شده، عملیاتها از طریق «افعال» خاصی به نام متدهای HTTP انجام میشوند که امکان تعامل با منابع را فراهم میکنند.
۵ متد HTTP پرکاربرد در توسعه APIهای RESTful عبارتند از GET، PUT، DELETE، POST و PATCH: این «افعال» ضروری امکان اجرای عملیات معروف به CRUD (ایجاد، خواندن، بهروزرسانی، حذف) را فراهم میکنند؛ یعنی ایجاد، خواندن، بهروزرسانی و حذف منابع.
APIهای REST چیستند؟
APIهای REST یا RESTful آنهایی هستند که اصول Representational State Transfer (REST) را رعایت میکنند؛ سبکی معماری که در سال ۲۰۰۰ توسط روی فیلدینگ تعریف شد و شامل جداسازی واضح کلاینت و سرور، استفاده از رابط یکنواخت و ساختار لایهای است که هر لایه مسئولیت مشخصی دارد. وقتی درخواستی از طریق یک API REST ارسال میشود، API نه خود منبع را، بلکه نمایندگی از وضعیت آن منبع را به کلاینت منتقل میکند که برای پاسخگویی به درخواست کافی است. برای اینکه یک API واقعاً RESTful محسوب شود، باید این اصول را رعایت کند:
- ارتباط بدون وضعیت (Stateless) بین کلاینت و سرور: هر درخواست مستقل است و هیچ اطلاعاتی ذخیره نمیشود؛
- امکان کش کردن دادهها؛
- رابط یکنواخت (Uniform Interface): منابع باید قابل شناسایی و جدا از نمایندگی ارسالی به کلاینت باشند و از طریق همان نمایندگی قابل دستکاری باشند؛
- سیستم لایهای که سرورها را در سلسلهمراتب دقیق سازماندهی میکند (برای کلاینت نامرئی).
کاربرد این مفاهیم منجر به توسعه APIهایی سریع، سبک و بهراحتی مقیاسپذیر میشود و امروزه پایه توسعه APIهای وب را تشکیل میدهد.
نقش متدهای HTTP در APIهای RESTful
در یک درخواست API RESTful، اطلاعات (یعنی نمایندگی منبع) میتواند در فرمتهای مختلفی مثل JSON یا HTML منتقل شود، اما ارتباط همیشه از طریق درخواست HTTP انجام میشود. متدهای HTTP جزء حیاتی هر API REST هستند، زیرا به کلاینت اجازه میدهند عملیاتی که باید روی منبع انجام شود را مشخص کند و به این ترتیب با آن تعامل داشته باشد. این عناصر که به «افعال HTTP» نیز معروفاند، در هر درخواست RESTful وجود دارند و به کلاینت امکان انجام عملیات CRUD روی منابع را به شکلی استاندارد و قابل پیشبینی میدهند. در معماری REST API هم از متدهای ایدمپوتنت (Idempotent) مثل GET و PUT استفاده میشود که امکان توسعه سرویس وب کارآمد و مقاوم در برابر خطا را فراهم میکنند و هم از متدهای غیرایدمپوتنت. تفاوت مهم است: با متدهای ایدپوتنت، چندین فراخوانی با همان پارامترها همان اثر یک فراخوانی را دارد و اثرات جانبی روی سرور چند برابر نمیشود و همیشه همان اطلاعات برگردانده میشود. اما با متدهای غیرایدمپوتنت مثل POST و PATCH، وضعیت سرور ممکن است تغییر کند و سیستم در معرض اثرات جانبی مختلف از جمله ایجاد منابع ناخواسته قرار گیرد.
۵ متد اساسی HTTP در سرویسهای API RESTful
پرکاربردترین متدهای HTTP در APIهای REST عبارتند از GET، PUT، DELETE، POST و PATCH که به کلاینت امکان خواندن، ایجاد، حذف یا تغییر یک منبع را میدهند:
- GET: پرکاربردترین متد در درخواستهای API. برای دریافت نمای داده از سرور استفاده میشود و ایدپوتنت است: تکرار همان درخواست چندین بار همان نمایندگی را برمیگرداند بدون تغییر وضعیت سرور؛
- PUT: یک منبع موجود را با جایگزینی کل محتوای آن بهروزرسانی میکند یا اگر وجود نداشته باشد، منبع جدیدی ایجاد میکند؛ عمدتاً برای بهروزرسانی استفاده میشود. در زمان ایجاد، خطر تولید ناخواسته منابع را دارد؛
- DELETE: یک منبع را حذف میکند. میتواند ایدپوتنت در نظر گرفته شود، اما ممکن است URL منبع حذفشده همچنان در دسترس بماند و پیامدهایی بر یکپارچگی پاسخهای بعدی سرور داشته باشد؛
- POST: تنها متدی است که عمدتاً روی مجموعههای منابع عمل میکند. برای ایجاد منبع زیرمجموعه با URL درون یک مجموعه استفاده میشود و آن را به سلسلهمراتب دقیقی مرتبط میکند. ذاتاً ایدپوتنت نیست: هر فراخوانی میتواند منبع جدیدی تولید کند؛
- PATCH: مانند PUT برای بهروزرسانی منابع استفاده میشود، اما فقط بخشهایی از محتوا را از طریق تغییراتی که در فرمتهای استاندارد مثل JSON و XML بیان شدهاند، اصلاح میکند. تکرار همان درخواست PATCH میتواند منبع را به وضعیتهای متفاوتی برساند، بنابراین ایدپوتنت نیست (هرچند میتوان آن را به شکلی ایدپوتنت استفاده کرد).
تنها متدهای ایدپوتنت را میتوان «ایمن» (Safe) دانست، زیرا وضعیت سرور را تغییر نمیدهند و اثرات عملیات کلاینت روی سرور و منابع را قابل پیشبینی میکنند. با این حال، حتی متدهای غیرایدپوتنت مثل POST و PATCH هم با پیادهسازی سیستمهای مناسب احراز هویت، مجوزدهی و مدیریت درخواستهای API میتوانند بهصورت ایمن استفاده شوند.
متدهای HTTP دیگر برای توسعه API
علاوه بر پنج متد اصلی مرتبط با عملیات CRUD، متدهای دیگری هم وجود دارند که بسیار مفیدند زیرا وضعیت منبع را تغییر نمیدهند اما امکان انجام اقدامات مهمی مثل بررسی وضعیت یا دنبال کردن مسیر درخواست را میدهند:
- HEAD: برای دریافت متادیتای منابع استفاده میشود، مثلاً بررسی اندازه یا وضعیت آنها پیش از ارسال درخواست دیگر؛
- OPTIONS: فهرستی از متدهای پشتیبانیشده توسط منبع را برمیگرداند و مشخص میکند چه عملیاتی روی آن قابل انجام است؛
- TRACE: به عنوان ابزار دیباگ استفاده میشود؛ به کلاینت اجازه میدهد ببیند درخواستش در مسیر توسط سرورهای میانی چگونه تغییر کرده است. وضعیت سرور را تغییر نمیدهد اما متد بسیار حساسی است زیرا میتواند دادههای حساس را افشا کند. به همین دلیل نوعی حمله سایبری به نام Cross-Site Tracing (XST) منحصراً بر پایه این متد HTTP استوار است.
متدهای HTTP یکی از ارکان اصلی توسعه APIهای RESTful هستند: با تعریف عملیات به شکلی استاندارد و قابل پیشبینی، APIها را قابل همکاری و یکپارچهسازی آسان در برنامهها میکنند. استفاده از استاندارد همچنین APIها را برای کلاینتها نیز شهودیتر و سادهتر میسازد.
