API چیست و سرویس‌ها چگونه با هم ارتباط برقرار می‌کنند؟

آشنایی با مفهوم رابط برنامه‌نویسی اپلیکیشن (API)، نحوه ارتباط سیستم‌ها، استانداردهای تبادل داده مانند JSON و چالش‌های کنترل ترافیک.

تاریخچه

در گذشته، نرم‌افزارها مانند جزایری کاملاً ایزوله عمل می‌کردند. در صورت نیاز به تبادل اطلاعات میان دو برنامه، مهندسان ناچار به توسعه کدهای پیچیده یا ایجاد دسترسی مستقیم به پایگاه داده سیستم مقصد بودند؛ رویکردی که امنیت و پایداری کل سیستم را با مخاطرات جدی مواجه می‌ساخت. برای رفع این چالش، به یک پل ارتباطی و زبان استاندارد نیاز بود تا سیستم‌ها بتوانند با اطمینان و امنیت بالا به تبادل داده بپردازند.

درک مفاهیم با تمثیل

برای درک بهتر، فرآیند سفارش غذا در یک رستوران را در نظر بگیرید. مشتری به عنوان درخواست‌کننده به منو دسترسی دارد، اما اجازه ورود مستقیم به آشپزخانه (محل پردازش و منابع) را ندارد. در این ساختار، خدمتکار نقش API را ایفا می‌کند؛ سفارش (درخواست یا Request) را دریافت کرده، به آشپزخانه منتقل می‌کند و پس از آماده‌سازی، نتیجه (پاسخ یا Response) را به مشتری تحویل می‌دهد. در این فرآیند، مشتری نیازی به درک نحوه پخت غذا ندارد و صرفاً اطلاعات را بر اساس استانداردهای منو درخواست می‌کند.

مفاهیم تخصصی

  • رابط برنامه‌نویسی اپلیکیشن (API): مخفف Application Programming Interface، یک پل ارتباطی میان نرم‌افزارها است؛ مجموعه‌ای از پروتکل‌ها و قوانین استاندارد که به دو یا چند سیستم اجازه می‌دهد با یکدیگر تعامل داشته باشند.

  • درخواست (Request): پیامی که یک سیستم (مانند اپلیکیشن کلاینت) برای اجرای یک عملیات یا دریافت اطلاعات به سیستم مقصد ارسال می‌کند.

  • پاسخ (Response): خروجی و نتیجه‌ای که سیستم مقصد پس از دریافت و پردازش درخواست، به سیستم مبدأ بازمی‌گرداند.

نرم‌افزارها برای تبادل داده معمولاً از یک قالب متنی سبک، خوانا و استاندارد به نام JSON استفاده می‌کنند. در این قالب، اطلاعات به صورت جفت‌های نام و مقدار سازمان‌دهی می‌شوند.

به عنوان نمونه، زمانی که یک اپلیکیشن هواشناسی درخواستی به سرور مرکزی ارسال می‌کند، پاسخ سرور می‌تواند دارای ساختار زیر باشد:

{
  "status": "success",
  "city": "Tehran",
  "temperature_celsius": 25,
  "condition": "Cloudy"
}

در این فرآیند، کلاینت (اپلیکیشن) نیازی به آگاهی از مکانیزم‌های پیچیده سرور برای اندازه‌گیری دما ندارد. سیستم مبدأ تنها از طریق API درخواست دریافت دمای شهر مورد نظر را ارسال می‌کند و سرور، این بسته JSON را به عنوان خروجی بازمی‌گرداند.

یکی از خطاهای متداول در طراحی معماری سرویس‌ها، عدم پیاده‌سازی مکانیزم‌های کنترل ترافیک برای API است. در صورتی که هزاران درخواست به صورت همزمان و بدون محدودیت به یک سرویس ارسال شوند، منابع سرور دچار اضافه‌بار شده و سیستم از کار می‌افتد (Crash).

در مهندسی قابلیت اطمینان، برای جلوگیری از این مشکل از مفهومی به نام محدودسازی نرخ درخواست (Rate Limiting) استفاده می‌شود. این مکانیزم تعداد درخواست‌های مجاز در یک بازه زمانی مشخص را کنترل کرده و از بروز اختلال در سرویس‌دهی جلوگیری می‌کند.

در فرآیند توسعه یک پلتفرم فروشگاهی، ممکن است ارتباط کلاینت با درگاه پرداخت (Payment API) با خطا مواجه شود. فرض کنید پس از بررسی لاگ‌ها مشخص گردد که کلاینت، شماره کارت بانکی را با خط تیره (مانند 4444-3333-2222-1111) ارسال می‌کند، در حالی که بر اساس مستندات فنی و قرارداد API بانک، سیستم مقصد تنها اعداد پیوسته و بدون فاصله را می‌پذیرد.

در چنین سناریویی، سیستم مبدأ (کلاینت) به دلیل نقض قرارداد و قالب استانداردِ تعیین‌شده مقصر است. همان‌طور که در تمثیل رستوران، مشتری باید سفارش خود را دقیقاً بر اساس چارچوب منو ثبت کند، در ارتباطات بین‌سیستمی نیز برنامه‌ها موظف هستند درخواست‌های خود را کاملاً منطبق با مستندات API سرویس‌دهنده قالب‌بندی و ارسال نمایند. در غیر این صورت، سرور قادر به پردازش اطلاعات نبوده و درخواست را با خطا بازمی‌گرداند.