RESTful API چیست؟ راهنمای ساده و کاربردی برای برنامهنویسان
فرض کنید وارد یک اپلیکیشن فروشگاهی شدهاید و صفحه محصولات را باز میکنید. چند لحظه بعد، لیستی از محصولات همراه با قیمت، تصویر و موجودی نمایش داده میشود.
اما یک سؤال مهم وجود دارد:
این اطلاعات چطور از سرور به اپلیکیشن شما میرسند؟
یا فرض کنید در یک اپلیکیشن تاکسی آنلاین، مبدأ و مقصد خود را وارد میکنید و چند ثانیه بعد نزدیکترین رانندهها روی نقشه نمایش داده میشوند. اپلیکیشن موبایل و سرور باید دائماً با یکدیگر اطلاعات ردوبدل کنند.
یکی از رایجترین روشها برای برقراری این ارتباط، استفاده از API است و یکی از محبوبترین سبکهای طراحی API نیز RESTful API نام دارد.
اما RESTful API دقیقاً چیست و چرا تقریباً در بسیاری از پروژههای وب، موبایل و نرمافزارهای مدرن با آن روبهرو میشویم؟
API چیست؟
قبل از اینکه سراغ RESTful API برویم، ابتدا باید مفهوم API را بشناسیم.
API مخفف Application Programming Interface است؛ یعنی رابط برنامهنویسی کاربردی.
به زبان ساده، API مانند یک واسط بین دو نرمافزار عمل میکند و به آنها اجازه میدهد با یکدیگر اطلاعات ردوبدل کنند.
برای مثال، فرض کنید یک اپلیکیشن موبایل فروشگاهی دارید.
اپلیکیشن میخواهد لیست محصولات را دریافت کند. بهجای اینکه مستقیماً وارد پایگاه داده سرور شود، یک درخواست به API ارسال میکند:
GET /api/products
سرور درخواست را دریافت میکند، اطلاعات موردنیاز را از پایگاه داده میخواند و نتیجه را برمیگرداند.
مثلاً:
[
{
"id": 1,
"name": "Laptop",
"price": 45000000
},
{
"id": 2,
"name": "Wireless Mouse",
"price": 1200000
}
]
در نتیجه، اپلیکیشن موبایل فقط با API ارتباط دارد و لازم نیست بداند اطلاعات دقیقاً در کدام جدول یا دیتابیس ذخیره شدهاند.
REST چیست؟
REST مخفف Representational State Transfer است.
REST یک زبان برنامهنویسی یا فریمورک نیست؛ بلکه مجموعهای از اصول و سبکهای طراحی برای ساخت APIهای تحت وب است.
وقتی یک API بر اساس اصول REST طراحی شود، معمولاً به آن RESTful API میگوییم.
هدف REST این است که ارتباط بین کلاینت و سرور تا حد امکان ساده، قابل پیشبینی، مقیاسپذیر و استاندارد باشد.
برای مثال، اگر بخواهیم یک API برای مدیریت محصولات فروشگاه طراحی کنیم، میتوانیم از آدرسهایی مانند این استفاده کنیم:
GET /api/products
GET /api/products/15
POST /api/products
PUT /api/products/15
DELETE /api/products/15
هر کدام از این درخواستها هدف مشخصی دارند.
RESTful API چگونه کار میکند؟
برای درک بهتر، یک فروشگاه اینترنتی را تصور کنید.
در این فروشگاه سه بخش اصلی داریم:
Client → API → Server
کلاینت میتواند یک سایت، اپلیکیشن موبایل یا حتی یک نرمافزار دسکتاپ باشد.
مثلاً کاربر در اپلیکیشن روی «نمایش محصولات» کلیک میکند.
اپلیکیشن درخواست زیر را ارسال میکند:
GET /api/products
سرور درخواست را دریافت میکند، اطلاعات محصولات را پیدا میکند و مثلاً پاسخ زیر را برمیگرداند:
{
"products": [
{
"id": 1,
"name": "Laptop",
"price": 45000000
},
{
"id": 2,
"name": "Keyboard",
"price": 2500000
}
]
}
اپلیکیشن این اطلاعات را دریافت کرده و آنها را به شکلی مناسب به کاربر نمایش میدهد.
بنابراین RESTful API را میتوان یک پل ارتباطی استاندارد بین کلاینت و سرور در نظر گرفت.
متدهای HTTP در RESTful API
یکی از مهمترین بخشهای RESTful API، استفاده از HTTP Methodهاست.
این متدها مشخص میکنند که دقیقاً چه عملیاتی روی یک منبع انجام شود.
چهار متد بسیار مهم عبارتاند از:
برای مثال، فرض کنید API ما برای مدیریت کاربران طراحی شده است.
دریافت کاربران
GET /api/users
یعنی:
لیست کاربران را به من بده.
دریافت یک کاربر
GET /api/users/25
یعنی:
اطلاعات کاربر شماره 25 را بده.
ایجاد کاربر جدید
POST /api/users
و اطلاعات کاربر میتواند در Body درخواست قرار بگیرد:
{
"name": "Ali",
"email": "ali@example.com"
}
ویرایش کاربر
PUT /api/users/25
حذف کاربر
DELETE /api/users/25
این ساختار باعث میشود API برای برنامهنویسان قابل پیشبینی باشد.
Resource در REST چیست؟
در REST معمولاً با مفهوم Resource یا «منبع» سروکار داریم.
Resource میتواند تقریباً هر نوع دادهای باشد.
برای مثال در یک فروشگاه اینترنتی:
/users
/products
/orders
/categories
/reviews
هرکدام از اینها یک Resource محسوب میشوند.
مثلاً:
/api/products
به مجموعه محصولات اشاره میکند.
و:
/api/products/15
به محصولی با شناسه 15 اشاره میکند.
نکته مهم این است که در REST معمولاً URL را بر اساس منبع طراحی میکنیم، نه بر اساس عملی که قرار است انجام شود.
مثلاً این ساختار:
GET /api/products
طبیعیتر از ساختاری مانند:
GET /api/getAllProducts
است.
یک مثال واقعیتر؛ اپلیکیشن فروشگاه
فرض کنید در حال ساخت یک فروشگاه اینترنتی هستیم.
میخواهیم API مربوط به محصولات را طراحی کنیم.
دریافت همه محصولات
GET /api/products
دریافت یک محصول
GET /api/products/10
اضافه کردن محصول
POST /api/products
ویرایش محصول
PUT /api/products/10
حذف محصول
DELETE /api/products/10
حالا تصور کنید تیم Front-End و تیم Back-End جدا از یکدیگر کار میکنند.
تیم Back-End فقط مستندات API را در اختیار تیم Front-End قرار میدهد.
تیم Front-End نیز میداند که برای دریافت محصولات باید چه درخواستی ارسال کند و چه نوع پاسخی دریافت خواهد کرد.
به این ترتیب، دو بخش پروژه میتوانند بدون وابستگی مستقیم به کد یکدیگر با هم ارتباط داشته باشند.
RESTful API و JSON
یکی از رایجترین فرمتها برای انتقال اطلاعات در RESTful API، JSON است.
JSON ساختاری ساده و خوانا دارد و تقریباً تمام زبانهای برنامهنویسی مدرن میتوانند با آن کار کنند.
برای مثال، پاسخ API میتواند به شکل زیر باشد:
{
"id": 25,
"name": "Mechanical Keyboard",
"price": 3500000,
"available": true
}
کلاینت میتواند این اطلاعات را دریافت کند و مثلاً نام محصول و قیمت آن را در صفحه نمایش دهد.
البته REST ذاتاً فقط به JSON محدود نیست؛ اما JSON در APIهای وب امروزی بسیار رایج است.
Status Code چیست؟
وقتی کلاینت به API درخواست ارسال میکند، سرور علاوه بر دادهها، معمولاً یک HTTP Status Code نیز برمیگرداند.
این کد به کلاینت میگوید نتیجه درخواست چه بوده است.
چند نمونه مهم:
کد مفهوم
200 : درخواست با موفقیت انجام شد
201 : اطلاعات جدید با موفقیت ایجاد شد
400 : درخواست نامعتبر است
401 : کاربر احراز هویت نشده است
403 : دسترسی مجاز نیست
404 : منبع موردنظر پیدا نشد
500 : خطایی در سمت سرور رخ داده است
مثلاً اگر کاربر بخواهد محصولی با شناسه 1000 را دریافت کند اما چنین محصولی وجود نداشته باشد، API میتواند پاسخ 404 Not Found برگرداند.
یک نمونه ساده در C#
فرض کنید با ASP.NET Core یک API ساختهایم و میخواهیم لیست محصولات را برگردانیم:
[HttpGet]
public IActionResult GetProducts()
{
var products = new[]
{
new { Id = 1, Name = "Laptop", Price = 45000000 },
new { Id = 2, Name = "Keyboard", Price = 2500000 }
};
return Ok(products);
}
در این مثال:
[HttpGet] مشخص میکند این Endpoint برای درخواستهای GET است.
GetProducts متدی است که اطلاعات محصولات را آماده میکند.
Ok() یک پاسخ موفق HTTP برمیگرداند.
اطلاعات میتوانند به صورت JSON در اختیار کلاینت قرار بگیرند.
اگر کاربر به Endpoint مربوطه درخواست GET ارسال کند، API اطلاعات محصولات را برای او ارسال میکند.
Endpoint چیست؟
یکی دیگر از اصطلاحاتی که هنگام کار با API زیاد میشنوید، Endpoint است.
Endpoint در واقع یک نقطه مشخص برای دسترسی به یک قابلیت یا منبع در API است.
مثلاً:
GET /api/products
یک Endpoint برای دریافت محصولات است.
یا:
POST /api/orders
میتواند Endpoint ایجاد سفارش جدید باشد.
در یک پروژه واقعی ممکن است دهها یا حتی صدها Endpoint داشته باشیم.
آیا RESTful API فقط برای سایتهاست؟
خیر.
یکی از دلایل محبوبیت REST این است که کلاینتهای مختلف میتوانند از یک API استفاده کنند.
برای مثال یک فروشگاه آنلاین ممکن است یک Backend داشته باشد و سه کلاینت مختلف به آن متصل شوند:
RESTful API
/ | \
/ | \
Website Android iOS
سایت، اپلیکیشن اندروید و اپلیکیشن iOS همگی میتوانند از API مشترک استفاده کنند.
حتی یک نرمافزار دسکتاپ یا سرویس دیگر نیز میتواند در صورت داشتن دسترسی مناسب با API ارتباط برقرار کند.
RESTful API چه مزایایی دارد؟
RESTful API به دلیل سادگی و استاندارد بودن، در بسیاری از پروژههای نرمافزاری استفاده میشود.
سادگی
ساختار درخواستها و URLها معمولاً قابل فهم و پیشبینی است.
جداسازی Front-End و Back-End
تیم Front-End و Back-End میتوانند مستقلتر از یکدیگر توسعه پیدا کنند.
پشتیبانی از کلاینتهای مختلف
یک API میتواند توسط وبسایت، موبایل و سایر نرمافزارها استفاده شود.
مقیاسپذیری
ساختار Stateless در REST میتواند به طراحی سیستمهایی کمک کند که راحتتر در چند سرور اجرا و مقیاسدهی شوند.
استفاده از استانداردهای وب
REST معمولاً از HTTP Methodها، Status Codeها و URLهای وب استفاده میکند؛ بنابراین برای توسعهدهندگان وب آشنا و قابل فهم است.
نگهداری سادهتر
اگر API با ساختار منطقی طراحی شود، توسعه و نگهداری آن در پروژههای بزرگ آسانتر خواهد بود.
Stateless بودن REST یعنی چه؟
یکی از مفاهیم مهم REST، Stateless بودن است.
به زبان ساده، هر درخواست باید اطلاعات لازم برای پردازش خودش را داشته باشد و سرور نباید برای فهمیدن درخواست فعلی به وضعیت درخواست قبلی وابسته باشد.
برای مثال اگر کاربر درخواست زیر را ارسال کند:
GET /api/orders
Authorization: Bearer TOKEN
اطلاعات احراز هویت موردنیاز در همان درخواست ارسال میشود.
این ویژگی میتواند طراحی و مقیاسپذیری سیستم را سادهتر کند.
البته Stateless بودن به این معنی نیست که برنامه هیچ دادهای را در سرور ذخیره نمیکند؛ بلکه منظور این است که وضعیت درخواستهای قبلی نباید برای پردازش درخواست فعلی ضروری باشد.
RESTful API چه تفاوتی با API معمولی دارد؟
API یک مفهوم کلی است.
REST یکی از روشها و سبکهای طراحی API است.
بنابراین:
هر RESTful API یک API است، اما هر API الزاماً RESTful نیست.
روشهای دیگری مانند GraphQL و gRPC نیز برای ارتباط بین نرمافزارها استفاده میشوند و هرکدام مزایا و کاربردهای خاص خودشان را دارند.
RESTful API کجا استفاده میشود؟
امروزه RESTful API را میتوان در پروژههای مختلفی مشاهده کرد، از جمله:
فروشگاههای اینترنتی
اپلیکیشنهای موبایل
سامانههای آموزشی
شبکههای اجتماعی
سیستمهای بانکی
پنلهای مدیریت
نرمافزارهای سازمانی
سرویسهای ابری
پروژههای مبتنی بر ASP.NET Core
برنامههای Java، Python، Node.js و PHP
برای مثال، وقتی یک اپلیکیشن موبایل اطلاعات پروفایل کاربر، سفارشها یا محصولات را از سرور دریافت میکند، احتمال زیادی وجود دارد که این ارتباط از طریق یک API انجام شده باشد.
آیا RESTful API همان Web API است؟
این دو اصطلاح بسیار به هم نزدیک هستند، اما دقیقاً یک معنی ندارند.
Web API معمولاً به APIای گفته میشود که از طریق وب و HTTP در دسترس است.
RESTful API نوعی Web API است که اصول REST را دنبال میکند.
برای مثال در ASP.NET Core Web API میتوان APIهایی طراحی کرد که RESTful باشند.
پس بهتر است این دو مفهوم را یکی در نظر نگیریم.
جمعبندی
RESTful API یکی از رایجترین سبکهای طراحی API برای ارتباط بین نرمافزارهاست.
در این روش، کلاینتهایی مانند سایت یا اپلیکیشن موبایل از طریق درخواستهای HTTP با سرور ارتباط برقرار میکنند و معمولاً با استفاده از متدهایی مانند GET، POST، PUT و DELETE روی منابع مختلف عملیات انجام میدهند.
برای مثال:
GET /api/products
POST /api/products
PUT /api/products/10
DELETE /api/products/10
RESTful API به توسعهدهندگان کمک میکند ارتباط بین Front-End و Back-End را با ساختاری استاندارد و قابل فهم طراحی کنند.
اگر قصد دارید وارد توسعه وب، ASP.NET Core، برنامهنویسی موبایل یا طراحی سیستمهای نرمافزاری مدرن شوید، آشنایی با API و RESTful API یکی از مفاهیم مهمی است که بارها در پروژههای واقعی با آن مواجه خواهید شد.
فرایانه؛ جایی که مفاهیم پیچیده برنامهنویسی را به زبان ساده، کاربردی و قابل فهم آموزش میدهیم. 💚