مقالات
معماری REST در API ها چیست؟
در دنیای مدرن فناوری اطلاعات، سیستمهای نرمافزاری دیگر به صورت ایزوله و جزیرهای کار نمیکنند. یک اپلیکیشن موبایل برای نمایش قیمتها باید با سرور مرکزی صحبت کند، سیستم حسابداری سازمان باید با درگاه بانک همگام شود و پلتفرم CRM نیازمند واکشی اطلاعات از دیتابیس انبار است. ما در مقاله پایه خود به طور مفصل بحث کردیم که API چیست و چگونه نقش یک پل ارتباطی را ایفا میکند. اما وقتی صحبت از توسعه وب و نرمافزارهای مقیاسپذیر در ابعاد کلان میشود، یک استاندارد و سبک معماری گوی سبقت را از بقیه ربوده است: معماری REST.
امروز بیش از ۸۵ درصد از سرویسهای متصل به شبکه اینترنت بر پایه اصول RESTful بنا شدهاند. این تفکر معماری به قدری در تار و پود اینترنت رسوخ کرده است که عدم تخصص در آن، توسعه هرگونه نرمافزار سازمانی را با بنبست مواجه میکند. در این راهنمای جامع و فوقتخصصی، به اعماق این مفهوم سفر میکنیم تا بدانیم REST API چیست، اصول ششگانه آن چگونه کار میکنند، آناتومی یک درخواست REST چیست و متدهای HTTP چگونه گرامر تبادل داده را مدیریت میکنند.
بخش اول: ریشهشناسی و تعریف بنیادین REST API
واژه REST مخفف عبارت Representational State Transfer به معنای «انتقال صریح حالت» است. این مفهوم اولین بار در سال ۲۰۰۰ میلادی توسط دانشمندی به نام روید فیلدینگ (Roy Fielding) در پایاننامه دکتری او معرفی شد. فیلدینگ که خود یکی از توسعهدهندگان اصلی پروتکل HTTP بود، به دنبال راهکاری میگشت که سیستمهای نرمافزاری سراسر جهان بتوانند بدون وابستگی به زبان برنامهنویسی یا سیستمعامل خاصی، بر بستر وب با یکدیگر تعامل داشته باشند.
یک نکته کلیدی که هر معمار نرمافزاری باید بداند این است: REST یک پروتکل (Protocol) نیست، بلکه یک سبک معماری (Architectural Style) است. تفاوت این دو در این است که پروتکلها (مانند SOAP یا gRPC) دارای قوانین ساختاری شدید، توابع پیشفرض و استانداردهای کامپایل سختگیرانه هستند، اما REST مجموعهای از «بایدها و نبایدهای طراحی» است. به کدهایی که با رعایت این اصول نوشته شوند، RESTful API میگویند.
در این سبک، هسته مرکزی حول مفهوم منبع (Resource) میچرخد. منبع میتواند هر موجودیت دیجیتالی یا فیزیکی باشد که سازمان با آن سروکار دارد؛ مانند یک کاربر، یک تراکنش بانکی، یک تصویر، یا حتی وضعیت آب و هوای یک شهر. هر منبع در دنیای REST دارای یک آدرس یکتا و اختصاصی به نام URI (Uniform Resource Identifier) است که کلاینتها از طریق آن، منبع را صدا میزنند.
بخش دوم: پیش از REST چه بود؟ (تفاوت کلیدی REST و SOAP)
برای درک عظمت معماری REST، باید بدانیم پیش از آن سازمانها چگونه یکپارچهسازی انجام میدادند. پروتکل غالب پیش از رست، SOAP (Simple Object Access Protocol) بود. SOAP یک پروتکل سنگین، مبتنی بر ساختار پیچیده XML و نیازمند پهنای باند بالا بود. در SOAP، کلاینت و سرور به شدت به یکدیگر وابسته (Tight Coupling) بودند و اگر کوچکترین تغییری در ساختار دادههای سرور ایجاد میشد، کدهای کلاینت نیز میشکست و از کار میافتاد.
معماری REST آمد تا این اتصال شدید را به یک اتصال سست و انعطافپذیر (Loose Coupling) تبدیل کند. REST به جای ارسال ساختارهای درهمتنیده XML، از قالبهای متنی بسیار سبکی مانند JSON (JavaScript Object Notation) استفاده میکند. حجم بسیار کم، خوانایی بالا برای انسان و سرعت خیرهکننده در پارس (Parse) کردن دادهها باعث شد که JSON و REST به زوج جدانشدنی دنیای وب تبدیل شوند.
بخش سوم: اصول ششگانه و قوانین اجباری معماری RESTful
یک API صرفاً به این دلیل که از پروتکل HTTP استفاده میکند، RESTful نامیده نمیشود. روی فیلدینگ ۶ شرط اساسی تعیین کرده است که سیستم شما باید به آنها پایبند باشد:
۱. معماری کلاینت-سرور (Client-Server Architecture)
این اصل بر جداسازی کامل وظایف (Separation of Concerns) تاکید دارد. فرانتآند (کلاینت) فقط و فقط مسئول نمایش دادهها، رابط کاربری و تجربه کاربر است و هیچ کاری با نحوه ذخیرهسازی دادهها در دیتابیس ندارد. در نقطه مقابل، بکآند (سرور) مسئول امنیت، پردازش تجاری و ذخیرهسازی است و کاری با ظاهر گرافیکی سیستم ندارد. این تفکیک به سازمانها اجازه میدهد بدون دست زدن به زیرساخت دیتابیس، ظاهر اپلیکیشن موبایل خود را بازطراحی کنند.
۲. بدون حالت بودن (Statelessness)
این مهمترین اصل برای مقیاسپذیری (Scalability) سازمان است. سرور نباید هیچگونه اطلاعاتی از وضعیت نشستها (Sessions) یا سابقه درخواستهای قبلی یک کلاینت را در حافظه خود ذخیره کند. هر درخواستی که از سمت کلاینت به سرور ارسال میشود، باید کاملاً مستقل و خودکفا باشد و تمامی اطلاعات لازم برای احراز هویت و پردازش (مثل توکن امنیتی JWT) را در خود جای داده باشد. به این ترتیب، اگر درخواست اول کاربر به سرور A برود و درخواست دوم او به سرور B (به دلیل لود بالانسینگ)، سیستم بدون مشکل کار خود را انجام میدهد.
۳. قابلیت کششدن (Cacheability)
در فضای اینترنت، ارسال مکرر درخواستها به دیتابیس، سرورها را ذوب میکند! REST حکم میکند که پاسخهای سرور باید صراحتاً برچسب قابل کش شدن (Cacheable) یا غیرقابل کش شدن داشته باشند. کلاینتها یا سرورهای واسط (مثل CDNها) میتوانند پاسخهای قابل کش را ذخیره کنند تا در درخواستهای بعدی، بدون درگیر کردن سرور اصلی، پاسخ را مستقیماً به کاربر نشان دهند. این امر سرعت را به طرز چشمگیری افزایش میدهد.
۴. رابط یکنواخت (Uniform Interface)
تمام اجزای سیستم باید از یک گرامر و ساختار آدرسدهی واحد پیروی کنند. رابط یکنواخت خود شامل چهار زیرقاعده است: شناسایی منابع در آدرس، دستکاری منابع از طریق نمایش متنی، پیامهای خودتوضیحدهنده (Self-descriptive) که ساختار خود را توصیف میکنند، و مفهومی به نام HATEOAS (استفاده از لینکها در پاسخ سرور برای راهنمایی کلاینت جهت گامهای بعدی).
۵. سیستم لایهبندی شده (Layered System)
کلاینت هرگز نباید و نمیتواند متوجه شود که مستقیماً به سرور نهایی متصل است یا در میانه راه لایههای امنیتی، لود بالانسرها، کلاسترهای حافظه پنهان یا سیستمهای مدیریتی نظیر WSO2 API Manager قرار دارند. این عدم شفافیت به معماران شبکه اجازه میدهد بدون اختلال در کار کلاینت، لایههای امنیتی فوقپیکربندیشده را به مرز سازمان اضافه کنند.
۶. کد در صورت نیاز (Code on Demand – اختیاری)
این تنها اصل اختیاری REST است. بر این اساس، سرور علاوه بر دیتای خام (JSON)، میتواند کدهای اجرایی (مانند اسکریپتهای جاوااسکریپت یا اپلتها) را برای کلاینت بفرستد تا مستقیماً در سمت کاربر اجرا شوند و قابلیتهای پویایی به سیستم اضافه کنند.
بخش چهارم: کالبدشکافی آناتومی یک درخواست (Request) در REST API
هر زمان که کلاینت میخواهد با یک REST API ارتباط برقرار کند، یک بسته اطلاعاتی حاوی ۴ جزء اصلی به سمت سرور میفرستد. درک این چهار جزء برای عیبیابی شبکه حیاتی است:
- ۱. آدرس نقطه پایانی (Endpoint / URL): مسیری که نشان میدهد منبع مورد نظر ما کجاست. ساختار استاندارد آدرسدهی به صورت جمع است؛ مانند:
/api/v1/invoices - ۲. متد HTTP (HTTP Verb): عملیاتی که میخواهیم روی منبع انجام دهیم (در بخش بعدی مفصل بحث میشود).
- ۳. هدرها (Headers): هدرها حاوی متادیتاها و اطلاعات پشت صحنه هستند. مثلاً هدر
Content-Type: application/jsonبه سرور میگوید دیتای ارسالی از نوع جیسون است، یا هدرAuthorizationتوکن امنیتی کاربر را حمل میکند. - ۴. بدنه درخواست (Body / Payload): اطلاعاتی که کلاینت میخواهد به سرور تزریق کند. مثلاً وقتی یک فرم ثبتنام پر میشود، نام و رمز عبور در قالب JSON درون Body قرار میگیرد (متدهای GET معمولاً بدنه ندارند).
بخش پنجم: متدهای اصلی HTTP؛ گرامر و ابزار فرامین REST
در معماری REST، ما حق نداریم در آدرس URL از افعال استفاده کنیم (مثلاً آدرس /deleteUser نقض آشکار قوانین REST است). به جای آن، آدرس باید ثابت بماند (/users/5) و منظور خود را با متدهای استاندارد HTTP بیان کنیم. این متدها مستقیماً با عملیاتهای اصلی دیتابیس یا همان CRUD همخوانی دارند:
| متد HTTP | عملیات CRUD | وضعیت امنیت (Safe) | تکرارپذیری (Idempotent) | توضیح عملکرد فنی در لایه سازمان |
|---|---|---|---|---|
| GET | Read (خواندن) | بله (Safe) | بله | دریافت یا واکشی اطلاعات از سرور بدون اعمال هیچگونه تغییر در هسته دیتابیس. |
| POST | Create (ایجاد) | خیر | خیر | ارسال اطلاعات به سرور برای پردازش و ایجاد یک رکورد یا منبع کاملاً جدید. |
| PUT | Update (بروزرسانی) | خیر | بله | جایگزین کردن کامل دیتای یک رکورد موجود. اگر رکورد وجود نداشته باشد، آن را میسازد. |
| PATCH | Update (جزئی) | خیر | خیر | اعمال تغییرات جزئی و محدود روی یک منبع (مثلاً فقط تغییر دادن فیلد ایمیل یک کاربر). |
| DELETE | Delete (حذف) | خیر | بله | ارسال دستور به سرور جهت حذف فیزیکی یا منطقی (Soft Delete) یک منبع خاص. |
دو مفهوم مهم در جدول بالا وجود دارد که تفاوت معماران ارشد و جونیور را مشخص میکند:
متد ایمن (Safe Method): متدی است که فراخوانی آن هیچ تغییری در دادههای سرور ایجاد نمیکند و فقط جنبه خواندنی دارد (مثل GET).
متد تکرارپذیر (Idempotent Method): متدی است که اگر آن را ۱ بار یا ۱۰۰ بار پشت سر هم با پارامترهای یکسان اجرا کنید، نتیجه نهایی روی دیتابیس دقیقاً یکسان خواهد بود. به عنوان مثال، متد PUT تکرارپذیر است چون جایگزین میکند، اما POST تکرارپذیر نیست چون ۱۰۰ بار اجرای آن، ۱۰۰ رکورد جدید در دیتابیس میسازد.
بخش ششم: پاسخ سرور و کدهای وضعیت HTTP (HTTP Status Codes)
یک سیستم RESTful استاندارد پس از دریافت درخواست، وضعیت موفقیت یا شکست عملیات را با کدهای سه رقمی استاندارد به نام **Status Codes** اعلام میکند. این کدها به پنج رسته اصلی تقسیم میشوند:
- کدهای خانواده 1xx (اطلاعاتی / Informational): این کدها نشان میدهند که درخواست اولیه توسط سرور دریافت شده و پردازش آن همچنان در حال انجام است. این خانواده موقتی هستند؛ مانند کد
100 Continueکه به کلاینت میگوید سرور بخش اول درخواست را پذیرفته و کلاینت میتواند بقیه دیتا را ارسال کند. - کدهای خانواده 2xx (موفقیت / Success): نشاندهنده این است که درخواست کلاینت با موفقیت دریافت، درک و توسط سرور پذیرفته شده است. معروفترین آنها
200 OK(عملیات با موفقیت انجام شد) و201 Created(رکورد جدید با موفقیت در دیتابیس ساخته شد) هستند. - کدهای خانواده 3xx (انتقال / Redirection): این کدها به کلاینت میگویند که برای تکمیل درخواست باید یک عملیات اضافه (مثل تغییر آدرس) انجام دهد. مانند
304 Not Modifiedکه به کلاینت اعلام میکند دادهها نسبت به قبل تغییری نکردهاند و میتواند با خیال راحت از نسخه کش شده خود استفاده کند و پهنای باند مصرف نکند. - کدهای خانواده 4xx (خطای کلاینت / Client Error): زمانی رخ میدهد که کلاینت اشتباهی مرتکب شده باشد (مثلاً آدرس اشتباه یا دیتای ناقص فرستاده باشد). مانند
400 Bad Request(فرمت داده ارسالی غلط است)،401 Unauthorized(کاربر احراز هویت نشده)،403 Forbidden(کاربر هویتی دارد اما اجازه دسترسی به این منبع خاص را ندارد) و خطای مشهور404 Not Found(منبع در سرور وجود ندارد). - کدهای خانواده 5xx (خطای سرور / Server Error): نشاندهنده این است که کلاینت درخواست را درست فرستاده، اما سرور به دلیل نقص فنی یا کرش داخلی قادر به پاسخگویی نیست. مانند
500 Internal Server Error(خطای برنامهنویسی بکآند) و503 Service Unavailable(سرور زیر بار ترافیک شدید است یا در حال تعمیر است).
تحول دیجیتال و جراحی معماری نرمافزار با کیان پرداز ریتون
پیادهسازی یک معماری بینقص RESTful در سازمانهای بزرگ که دارای صدها سیستم قدیمی (Legacy) هستند، کاری به شدت حساس و تخصصی است. عدم رعایت استانداردهای Statelessness، طراحی غلط آدرسدهی منابع و عدم استفاده درست از کدهای وضعیت میتواند منجر به پدید آمدن غول ویرانگری به نام معماری اسپاگتی شود که هزینههای نگهداری سیستم را سر به فلک میکشد.
شرکت کیان پرداز ریتون با بهرهگیری از برترین مهندسان ارشد نرمافزار و متخصصان یکپارچهسازی، در کنار سازمان و هلدینگ شماست تا سیستمهای ناهمگون و قدیمی شما را کالبدشکافی کرده و آنها را به وبسرویسهای بسیار چابک، مدرن و استاندارد مبتنی بر اصول RESTful و پلتفرمهای بینالمللی یکپارچه سازد.
برای دریافت مشاوره تخصصی در زمینه معماری مجدد نرمافزارها و پیادهسازی گیتویهای یکپارچه، با مشاوران ارشد ما در کیان پرداز ریتون تماس حاصل فرمایید.