نیک آموز > وبلاگ > زبان های برنامه نویسی > مسیردهی در API مسیردهی در API زبان های برنامه نویسی نوشته شده توسط: رضا تجری تاریخ انتشار: ۱۴ دی ۱۴۰۴ آخرین بروزرسانی: 15 دی 1404 زمان مطالعه: 14 دقیقه ۰ (۰) مسیردهی (Routing) در طراحی API یکی از مهمترین بخشهاست. در بسیاری از پروژهها روشهای نامناسبی برای تعریف مسیر API استفاده میشود؛ برای مثال، مسیرهایی مانند: /api/getAllProducts یا /api/deleteProductById اغلب دیده میشوند. چنین آدرسهایی در نگاه اول شاید ساده به نظر برسند، اما چالشهایی به وجود میآورند: مسیرها طولانی و گیجکننده میشوند و تیمهای فرانتاند یا موبایل ممکن است دقیقاً ندانند چه آدرسی را باید صدا بزنند. در نتیجه، نگهداری و توسعهٔ آتی API هم دشوار میشود. اصول RESTful و نقش HTTP متدها یکی از راهحلهای استاندارد برای این مشکل، تبعیت از اصول RESTful است. در رویکرد RESTful، نام مسیر صرفاً باید نمایانگر منبع (Resource) باشد، نه عملیات. خود متدهای HTTP مثل: (GET، POST، PUT، DELETE) حاوی فعل عملیاتی هستند و بنابراین نباید عملیات را در آدرس قرار دهیم. به بیان دیگر، به جای نوشتن /createOrder یا /getAllProducts، مسیرها را تنها بر اساس موجودیتها تعریف میکنیم. برای نمونه در یک فروشگاه آنلاین: دریافت همه محصولات → GET /api/products دریافت محصول مشخص با شناسهٔ → {id} GET /api/products/{id} ایجاد محصول جدید → POST /api/products بهروزرسانی محصول موجود با شناسهٔ → {id} PUT /api/products/{id} حذف محصول با شناسهٔ → {id} DELETE /api/products/{id} این مثالها مطابق اصول REST هستند و در مستندات رسمی نیز توصیه شده است که برای منابع از اسم استفاده کنیم و عملیات را به متد HTTP واگذار کنیم. برای مثال داکیومنت مایکروسافت بهوضوح میگوید که نباید در URLها از افعال استفاده کرد؛ مثلاً مسیر /create-order نامناسب است. همچنین مقالات آموزشی نشان میدهند که بهطور عام مسیرها باید اسم منابع باشند (معمولاً جمع)، نه افعال. آموزش برنامه نویسی قدم به قدم با مسیر مشخص و منظم در نیک آموز مزایای مسیردهی RESTful رعایت این اصول چند مزیت مهم دارد: سادگی و اختصار: آدرسها کوتاهتر و قابلفهمتر میشوند. استفاده از اسامی ثابت برای منابع و متدهای HTTP برای عملیات، به آدرسهای پیشبینیپذیر و استاندارد جهانی منتهی میشود. قابلیت همکاری تیمی: وقتی تمام تیمهای توسعه (فرانتاند، موبایل، بکاند) از قواعد یکسانی پیروی کنند، ارتباط میان بخشها تسهیل میشود و نیازی به توضیح اضافه درباره چگونگی هر مسیر نیست. این نکته در مستندات معماری API هم تأکید شده است که یک نامگذاری منسجم در درازمدت از بهترین تصمیمات طراحی خواهد بود. نگهداری و توسعه سادهتر: چون ساختار URLها واضح و یکسان است، افزودن قابلیتهای جدید (مثلاً فیلترینگ، صفحهبندی یا منابع تودرتو) آسانتر انجام میشود. همچنین ابزارها و چارچوبهای بسیاری وجود دارند که بر اساس این ساختار استاندارد کار میکنند (مثلاً در ASP.NET Core به صورت پیشفرض از [Route(“api/[controller]”)] و HTTP متدها استفاده میشود تا آدرسهایی مانند GET api/values و GET api/values/{id} داشته باشیم). بهطور خلاصه، در مسیردهی RESTful تمرکز بر منابع است، نه روی عملیات درون URL. این شیوه با استانداردهای طراحی وبسرویس همخوانی دارد و توسعه API را برای همه اعضای تیم روانتر میکند. دیدگاههای جایگزین و تجربیات توسعهدهندگان با این حال در عمل برخی توسعهدهندگان تجربههای متفاوتی داشتهاند و مدلهای دیگری هم پیشنهاد کردهاند. برای مثال، برخی ترجیح میدهند از مسیرهای شامل فعل در آدرس استفاده کنند تا عملیات را صریحتر کنند. در یک بحث گروهی، توسعهدهندهای پیشنهاد کرده مسیرهایی مانند /products/1/show یا /products/list و /products/store به کار روند تا عملکردها واضحتر باشد. این سبک، شباهت بیشتری به APIهای RPC- مانند دارد. اما توجه کنید که منابع طراحی API به طور کلی احتیاط میکنند از چنین کاری دوری کنیم. برای مثال به نقل از سایت Treblle در راهنمای خود میگوید «نباید شامل افعال در مسیرها شد» و مثال میآورد مسیر POST /users/{userId}/sendActivationEmail نادرست است؛ بلکه باید همان عمل را با ساختار زیرمنبع مانند POST /users/{userId}/activation-email نمایش داد. همچنین برخی توسعهدهندگان به عملیات دستهای (bulk) اشاره کردهاند. برای این موارد یک راهکار مرسوم این است که یک زیرمسیر ویژه برای عملیات دستهای قرار دهیم. بهعنوان مثال، اگر میخواهیم چند کاربر را همزمان اضافه کنیم، میتوانیم از مسیری مثل: /api/users/bulk استفاده کنیم. به این ترتیب هم ساختار URLها منسجم باقی میماند و هم نیازمندیهای خاص پروژه برطرف میشود. در یک مثال دیگر، برای متمایز کردن عملیات ثبتنام عادی کاربر از افزودن کاربر توسط ادمین، میتوان از نشانهگذاری مسیر استفاده کرد. مثلاً مسیر /api/users را برای عملیات عمومی در نظر گرفت و /api/admin/users را برای عملیات مدیریت کاربران. یا اینکه در همان مسیری که داریم، با منطق برنامه بررسی کنیم که درخواست از طرف ادمین است یا کاربر عادی (هر چند این کار باعث پیچیدهتر شدن منطق میشود). چارچوبهایی مانند ASP.NET Core به شما امکان میدهند با استفاده از صفتهای [Route] و [HttpGet] و مانند آن، مسیرهای دلخواه را تعریف کنید و تمایزهای لازم را اعمال کنید. در نهایت، توجه داشته باشید که هرچند رویکرد RESTful رایج و پیشنهادی است، باید نیازهای خاص پروژه را هم در نظر گرفت. مستندات مختلف نیز چنین منعطف هستند که میتوانید براساس منطق دامنهٔ کاری خود و انتظارات کلاینت، گاهی زیرمسیرها یا عملیات خاصی اضافه کنید؛ اما باید دقت کنید که به هم ریختگی الگوها (مانند مخلوط کردن افعال در URL) پیش نیاید. بهترین آموزش برنامه نویسی با مسیر روشن و نتیجه واقعی در نیک آموز سخن پایانی نکته در مورد استانداردها در جمعبندی، مسیردهی RESTful به این معناست که API را طوری طراحی کنیم که مسیرها ساده، قابلپیشبینی و استاندارد باشند. مسیر هر منبع (مثل/products یا /users) باید فقط نماینده موجودیتها باشد و خود عملیاتها با متد HTTP تعیین شوند. این طراحی یک زبان مشترک برای همه تیم فراهم میکند و در بلندمدت توسعه پروژه را تسهیل میکند. با این روش، مشخص است که GET برای خواندن منابع، POST برای ایجاد، PUT/PATCH برای بهروزرسانی و DELETE برای حذف استفاده میشود. در صورتی که نیاز به عملیات غیرمعمولی باشد (مانند لغو سفارش)، معمولاً آن را به عنوان یک زیرمنبع در نظر میگیرند (مثلاً POST /orders/{orderId}/cancel برای لغو سفارش). در همین حال، توجه به اظهار نظرهای عملی متفاوت کاربران نیز مفید است، چون نشان میدهد در پروژههای واقعی ممکن است به انطباقهایی فراتر از فرضیات صرفا تئوریک نیاز داشته باشیم. با این حال، توصیه میشود تا حد امکان از الگوهای پذیرفتهشده پیروی کرده و هر تغییری را مستند و معنادار انجام دهیم. اگر میخواهید این مباحث را اصولی یاد بگیرید و درست در پروژهها به کار بگیرید، در نیک آموز، آموزشهای برنامهنویسی با تمرکز بر یادگیری کاربردی و قابل اجرا ارائه میشود تا بتوانید مسیرها و Endpointها را استاندارد، تمیز و قابل نگهداری طراحی کنید. سوالات متداول ۱. برای دریافت همه منابع (مثلاً همه محصولات)، چه مسیری باید استفاده شود؟ طبق استاندارد RESTful معمولاً از مسیر اصلی منابع بهصورت جمع استفاده میشود. مثلاً GET/api/products برای بازیابی همه محصولات استفاده میشود و نیازی به افزودن فعل مثلاً getAllProducts در مسیر نیست. ۲. چرا در آدرسهای API نباید از افعال (verbs) استفاده کرد؟ چون HTTP خود متدهای عملیاتی (GET ،POST و غیره) را فراهم میکند، اضافه کردن فعل در URL اطلاعات جدیدی ارائه نمیدهد و فقط آدرس را طولانی و گیجکننده میکند. منابع طراحی REST همگی تأکید دارند که مسیر باید نمایانگر منبع باشد، نه عمل. بهعنوان مثال مستند مایکروسافت میگوید به جای /create-order از /orders استفاده شود. ۳. چگونه عملیات دستهای (Bulk) را طراحی کنیم؟ برای انجام عملیات دستهای معمولاً راهکاری مانند اضافه کردن یک زیرمسیر bulk/ پیشنهاد میشود. مثلاً برای ایجاد چند محصول در یک درخواست میتوان از POST /api/products/bulk استفاده کرد، به طوری که همه عملیات مربوط به محصولات تحت /api/products متمرکز باشند. روش دیگر این است که با همان POST /api/products یک آرایه در بدنه درخواست ارسال و هر بار همه را ایجاد کنیم که در بسیاری از سامانهها قابل پشتیبانی است. ۴. برای عملیات خاص غیر از CRUD (مثل لغو یک سفارش)، چه کار کنیم؟ معمولاً چنین عملیاتهایی را بهعنوان یک زیرمنبع مدل میکنند. مثلاً برای لغو سفارش ممکن است مسیر POST /orders/{orderId}/cancel تعریف شود. این کار، عملیات لغو را بهعنوان زیرمنبعی از orders در نظر میگیرد و از مسیر ساده orders/ منحرف نمیشود. گاهی هم از متد PATCH برای تغییر وضعیت سفارش استفاده میکنند (مثلاً PATCH /orders/{orderId} با بدنهای که وضعیت را به “canceled” تغییر میدهد). ۵. آیا میتوان از مسیرهایی مثل /products/1/show یا /products/list استفاده کرد؟ استفاده از این مسیرها به مفهوم افزودن فعل در URL است که توصیه نمیشود. در طراحی RESTful به جای /products/1/show از GET /products/1 و بهجای /products/list از GET /products استفاده میشود. منابع معتبر طراحی API از قبیل سایت Treblle صراحتاً میگویند که استفاده از افعال در Endpoint اشتباه است. بنابراین بهتر است به الگوهای استاندارد REST پایبند باشید. ۶. چگونه میتوان بین مسیرهای کاربر عادی و ادمین تفاوت گذاشت؟ راهحلهای مختلفی وجود دارد. یک روش مرسوم این است که مسیرهای مدیریت (ادمین) را با پیشوند یا زیرمنابع مشخص کنیم. برای مثال مسیر /api/users میتواند عملیات عمومی را انجام دهد و /api/admin/users مربوط به عملیات مدیریتی باشد. در چارچوبهایی مانند ASP.NET Core میتوان با تعریف کنترلرهای جداگانه یا شروط احراز هویت این کار را انجام داد. گاهی هم از یک مسیر استفاده و در منطق برنامه نقش کاربر (ادمین یا معمولی) بررسی میشود که بسته به نیازهای امنیتی و طراحی پروژه متفاوت است. ۷. مزایای مسیردهی RESTful نسبت به روشهای دیگر چیست؟ مهمترین مزیت، یکپارچگی و سازگاری با استانداردهای جهانی است. مسیرهای RESTful به دلیل استفاده از اسم منبع و HTTP متدهای استاندارد کوتاه، واضح و قابلفهم هستند. همچنین یادگیری و استفاده از API برای توسعهدهندگان آسانتر است، چون بسیاری از زبانها و فریمورکها آن را میشناسند. علاوه بر این، نگهداری و مقیاسپذیری API در آینده نیز با این الگو سادهتر میشود. در مجموع، طراحی RESTful کمک میکند تا همه اعضای تیم با یک زبان مشترک کار کنند و توسعه پروژه با روندی هموارتر دنبال شود. چه رتبه ای میدهید؟ میانگین ۰ / ۵. از مجموع ۰ اولین نفر باش دانلود مقاله مسیردهی در API فرمت PDF 6 صفحه حجم 1 مگابایت دانلود مقاله معرفی نویسنده مقالات 5 مقاله توسط این نویسنده رضا تجری توسعه دهنده NET. - تجربه استفاده از Clean Code و استفاده از اصول SOLID ،GRASP برای بهتر طراحی کردن شی گرایی، تجربه در کار تیمی و متولوژی AGILE و همکاری در توسعه و پروژه های سامانه هوشمند سازی شهری. معرفی محصول علیرضا ارومند آموزش ASP.NET Core 3,900,000 تومان مقالات مرتبط ۳۰ آذر زبان های برنامه نویسی تفاوت API و REST API رضا تجری ۰۸ آذر زبان های برنامه نویسی برنامهنویسی چیست؟ تیم فنی نیک آموز ۲۷ آبان زبان های برنامه نویسی Repository و Unit of Work در Infrastructure Layer: الگوها، مزایا و خطاهای رایج رضا تجری ۰۴ آبان زبان های برنامه نویسی مسیریابی در Razor Pages: از مفاهیم پایه تا پیادهسازی رضا تجری دیدگاه کاربران لغو پاسخ دیدگاه نام و نام خانوادگی ایمیل ذخیره نام، ایمیل و وبسایت من در مرورگر برای زمانی که دوباره دیدگاهی مینویسم. موبایل برای اطلاع از پاسخ لطفاً مرا با خبر کن ثبت دیدگاه Δ
توسعه دهنده NET. - تجربه استفاده از Clean Code و استفاده از اصول SOLID ،GRASP برای بهتر طراحی کردن شی گرایی، تجربه در کار تیمی و متولوژی AGILE و همکاری در توسعه و پروژه های سامانه هوشمند سازی شهری.