تدوین: مهندس محبوبه مهدی زاده

تاريخ آخرين ويرايش: 18 خرداد 1399

اداره سامانه های کاربردی مرکز فاوای دانشگاه فردوسی مشهد

 

Swagger چیست؟

APIها امروزه دنیای مدرن وب را تحت تاثیر خود قرار داده‌اند. در واقع APIها با نمایان ساختن بخشی از عملکرد و اطلاعات نهفته موجود در برنامه‌ها، تعامل آن‌ها با محیط خارج را ممکن می‌کنند.

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

Swagger  یک الگوی توصیفی برای تولید و داکیومنت کردن Web APIهاست که بعدها به یک استاندارد، به نام OpenAPI Specification تبدیل شد.

به زبان ساده، یک استاندارد برای تعریف API نوشته شده است و Swagger ابزارهای لازم برای این کار را در اختیار قرار میدهد، درواقع شما بوسیله‌ی یک ساختار JSON یا YAML معین می کنید که APIهای شما چه روت (Route) هایی دارد، چه ورودی هایی دریافت می کند و خروجی چه مسیری خواهد بود.

علاوه بر این وقتی یک استاندارد تعیین میشود، ابزارهای بسیاری تولید می‌شوند که زبان یکدیگر را درک می‌کنند. تعدادی از این ابزارها عبارتنداز:

Swagger Editor:

اولین ادیتور اپن‌سورسِ کاملا اختصاصی برای APIهای مبتنی بر OpenAPI می‌باشد. این ابزار یک محیط در اختیار کاربر قرار می‌هد که در آن می‌تواند مسیرهای موجود در API را تعیین کند، توضیحات آن را بنویسد و مشخص کند که چه پارامترهایی باید برای آن ارسال شود و خروجی آن چه خواهد بود. شما می‌توانید API خود را در این ادیتور طراحی، توصیف و مستندسازی کنید.

Swagger UI :

این ابزار یک فایل معتبر Swagger  را دریافت می‌کند و توضیحات آن را نمایش می‌دهد و امکان تست نیز وجود دراد. در واقع این ابزار، مستندات API را نمایش و تست آن را انجام میدهد.

Swagger CodeGen :

یک تولیدکننده کد(code generator) اپن سورس است که شامل مجموعه ابزارهایی است که این امکان را به کاربر میدهد که از یک فایل Swagger (تعریف شده با RESTful API) کدهای سمت سرور (server stubs) و یا سمت کلاینت (client SDK) را تولید کند.

Swagger  فقط یک الگوی توصیفی برای نوشتن API هست و کدی نوشته نمی‌شود، فقط تعریف می کنید که API  به چه شکلی خواهد بود. اصولاً این موضوع با برنامه نویسی Backend ارتباط پیدا می کند و ارتباط مستقیمی با زبان‌هایی مثل اندروید ندارد.

محصولاتی که تحت وب هستند، همیشه یک بخش سرور و یک بخش کلاینت دارند. کلاینت ها با سرور ارتباط برقرار می کنند، که این کلاینت ها میتوانند وبسایت یا اپ موبایل یا دسکتاپ و یا همه‌ی اینا باشند.

ضرورت وجود ابزارهایی مثل Swagger زمانی بیشتر نمایان می‌شود که ایجاد API و کلاینت آن را به صورت موازی انجام دهیم.  با داشتن یک فایل swagger می‌توان در Swagger UI  کل مسیرهای API را به همراه توضیحات و نحوه‌ی استفاده از آن را مشاهده نمود، و نیز API را تست کرد، یعنی بدون نوشتن کد، می‌توان API را کاملاً تست کرد و در صورت تمایل با استفاده از ابزار CodeGen تمامی فایل‌های آماده برای استفاده در اندروید یا جاوا اسکریپت و... را ایجاد کرد. و این موضع بسیار کار تیمی را بهبود می‌بخشد.

نظارت و مدیریت API های مختلف نیازمند کار زیادی می باشد .از دیگر مزایای استفاده از ابزارهای swagger در هنگام کار با Web API ها می‌توان به موارد زیر اشاره نمود:

تست و debug کردن  API ها نیاز به عیب یابی دارد: انجام این کار برای برنامه های موبایل خیلی سخت و طاقت فرسا است . IDE ها (محیطهای توسعه یکپارچه ) هم برای راحت تر کردن این قضیه وجود دارد ولی به مناسب Debugg کردن API ها نمی‌باشد.

تعیین منبع مشکلات از طریق عملکرد کاربر در همان لحظه: برنامه نویسان دوست دارند استفاده API ها را در یک برنامه مشاهده کنند. مثلا زمانی که کاربر در هنگام استفاده از یک برنامه با خطایی مواجه می شود، برنامه نویس دوست دارد بداند چه تقاضایی باعث بوجود آمدن چنین خطایی شده و به چه دلیل .

تولید پاسخهای سفارشی از WebAPI : علی‌الخصوص زمانی که برنامه و API در یک خط موازی حرکت می‌کنند یا زمانی که یک ویژگی خاص جدید نیازمند بروزرسانی API می ماند تا قابل استفاده شود.

می‌توان اینطور نتیجه گرفت که:

«برای تسریع استفاده از API های تحت وب برنامه نویسان نیازمند نمونه های استفاده از آن API ها، مستندات منسجم و با مفهوم و هر آن چیزی هستند که در صرفه جویی وقتشان کمکشان کند. برای همین نیازمندی، ساختارهایی همانند Swagger موجود است که ثابت کرده بسیار کارامد هستند.»

 

Swagger Editor

Swagger Editor یک ادیتور open source برای طراحی، تعریف و مستندسازی APIهای RESTful در swagger specification می باشد. سواگر ادیتور به صورت رایگان و آنلاین در editor.swagger.io  قابل دسترس می‌باشد. سورس کد آن نیز در gethub موجود است:

GitHub: https://github.com/swagger-api/swagger-editor

این ادیتور در هر مرورگری کار میکند. در مرورگر اجرا می‌شود و به طور کامل client-side javascript ساخته می‌شود و نگرانی بابت ذخیره اطلاعات API در سرورهای سواگر نمی‌باشد. در این ادیتور ذخیره‌سازی ابری وجود ندارد، بنابراین در صورت نیاز باید اطلاعات را به صورت لوکال ذخیره کرد. از سواگر ادیتور می توان به صورت لوکال یا از نسخه تحت وب آن استفاده نمود.

پیش نیازها برای نصب لوکال  Swagger Editor

موارد زیر قبل از دانلود و اجرای Swagger Editor باید بر روی سیستم نصب شود:

Nodejs

هنگامی که nodejs با موفقیت نصب شد، بایستی npm نیز به صورت کامل نصب شود که می‌توان با استفاده از دستور زیر در محیط CMD این کار را انجام داد:

npm install;

اگر سیستم عامل ویندوز است:

میتوان از nodejs.msi برای نصب nodejs استفاده کرد. فایل installer یا همان msi سه عمل را انجام میدهد. ابتدا برنامه nodejs را داخل یک پوشه کپی می کند(مسیر انتخابی). در گام دوم  npm را نصب می‌کند. و در آخر، آدرس nodejs  را در متغیر محیطی PATH قرار می دهد تا بتوان از node  در  command prompt  استفاده کرد(اگر بعد از نصب سیستم reboot شود بهتر است).

در صورت استفاده از فایل exe باید آن را در پوشه ای ذخیره کرد و بعد از آن، آدرس node را در path ایجاد و در نهایت npm را به صورت دستی نصب نمود( در اینجا باید فایل zip مربوط به npm را در پوشه ای که nodejs قرار دارد extract کنیم)

Git

برای clone کردن اطلاعات بایستی git بر روی سیستم نصب شود.

پس از نصب موارد بالا برای clone کردن سواگر، در محیط cmd وارد مسیر hdocs در Xampp یا (www در wamp) می‌شویم و دستور زیر را اجرا می‌کنیم:

>  git   clone   https://github.com/swagger-api/swagger-editor.git    swagger-editor-doc

با این دستور swagger-editor در مسیر موردنظر قرار می‌گیرد. حال می‌توان swagger-editor-doc را اجرا کرد.

زمانی که ادیتور را برای اولین بار اجرا می‌کنیم، در این محیط Swagger Petstore API  نمایش داده می‌شود (یک API ساده است که توسط پروژه‌های سواگر برای نمایش قابلیت‌های گسترده OpenAPI specification بکار می‌رود و در سواگر ادیتور به عنوان مثال پیش‌فرض می‌باشد).

همانطور که می‌بینید، swagger editor یک محیط دو قسمتی را نشان می‌دهد:

سمت چپ شامل مشخصات (specification) در قالب YAML است و سمت راست مستندات API تعاملی تولیدشده را نشان می‌دهد. هرگونه ویرایش در سمت چپ ادیتور،  بر روی اطلاعات سمت راست راست تاثیرگذار است و تغییرات در همان لحظه در سمت راست نمایان می‌شود.

تعاریف OpenAPI را می‌توان بصورت YAML یا Json مرتب کرد. با این‌که swagger editor هر دو مورد را قبول می‌کند ولی استفاده از YAML را در اولویت قرار می‌دهد و زمانی‌که شما فایل Json را کپی یا Paste می‌کنید از شما درخواست می‌کند تا آن را تبدیل کنید (convert).

یک نوار منو در قسمت بالایی ادیتور وجود دارد که شامل منوهای زیر می‌باشد:

File:

با استفاده از این منو می‌توان فایل OpenAPI را import کرد. این فایل میتواند از فایل‌هایی باشد که بر روی سیستم شما ذخیره است (منو Import File) و یا اینکه می‌تواند یک URL باشد (Import URL).  با استفاده از زیرمنوهای Save as YAML و Convert and save as json می‌توان ورژن‌های YAML یا JSON مواردی که در ادیتور تعریف شده است را دانلود کرد. زیرمنو Clear editor صفحه ادیتور را پاک می‌کند.

Edit

در این منو تنها یک زیرمنو (Convert to YAML) وجود دارد که با استفاده از آن می‌توان json را به YAML تبدیل کرد.

Generate Server و Generate Client:

این دو منو، لیستی از انواع مختلف زبان‌های برنامه‌نویسی و فریمورک‌ها را نمایش می‌دهند. اگر بر روی یکی از آن‌ها کلیک کنید، یک فایل zip دانلود می‌شود که شامل بدنه و طرح پروژه برای تولید یا تحلیل API با تعاریف شما است.

این دو ویژگی (Generate Server و Generate Client) در پروژه open source Swagger Codegen ساخته می‌شود. این بدین معناست که برخلاف مابقی قسمت‌های اپلیکیشن، اگر شما از این دو ویژگی استفاده کنید، تعریف OpenAPI برای پردازش به سرور فرستاده می‌شود و ر روی کلاینت پردازش نمی‌شود.

لازم به ذکر است که ادیتور swagger ابزاری برای کمک در یادگیری نوشتن OpenAPI است و مستقیما با تعاریف API قابل خواندن برای ماشین (machine-readable) کار می‌کند. این ادیتور، ویژگی‌های استاندارد IDE مثل هایت‌لایت کردن سینتکس، auto complete و اعتبارسنجی (validate) را دارد، اما یک طراح API بصری (visual API designer) نیست و به طور کلی جامعه هدف این ادیتور تنها برنامه‌نویسان می‌باشند و برای افراد غیر برنامه‌نویس مناسب نیست.

ایجاد یک openAPI definition:

برای ایجاد تعریفی از openApi در ادیتور swaager ابتدا باید محیط ادیتور را پاک کنیم(File → Clear editor).

 

ساختار پایه:

اولین موردی که باید در محیط ادیتور نوشته شود، دستوری است که باید نوع و ورژن specification را مشخص کند.

Swagger: ‘2.0’

آبجکت‌ها:

نام

اجباری

توضیحات

swagger

✓ 

از نوع رشته. نوع و ورژن specification

info

یک متادیتا درمورد API.

servers

یک آرایه از آبجکت‌های سرورکه اطلاعات ارتباطی با یک سرور هدف را ارائه می‌دهد. اگر server تعریف نشده باشد یا یک آرایه خالی باشد؛ مقدارپیش‌فرض یک آبجکت server با مقدار url ای برابر ./ خواهد بود

paths

عملیات‌های و مسیرهای دردسترس برای API

components

 

یک المنت برای نگهداری طرح‌های(schemaها) متنوع برای specification

security

 

یک اعلان از مکانیزم‌های امنیتی که می‌توانند در سراسر API استفاده شوند. لیست مقادیر شامل اشیاء موردنیاز امنیتی جایگزین است که می‌تواند استفاده شود. فقط یک مورد از آبجکت‌های الزامی امنیتی نیاز است تا اجازه درخواست تایید شود. عملیات‌های فردی (individual operation) می‌تواند این تعریف را تغییر دهد(override).

tags

 

لیستی از تگ‌های استفاده شده توسط specification با متادیتا اضافی. ترتیب تگ‌ها می‌تواند منعکس‌کننده ترتیب آن‌ها بوسیله ابزارهای پارسینگ باشد

externaldoc

 

داکیومنت خارجی

آبجکت Info:

عموما بهتر است که اطلاعاتی کلی در مورد API در داخل مشخصات گنجانده شود؛ اگر قرار است API به صورت عمومی در دسترس قرار گیرد، از این طریق می‌توان اعتماد کاربر به محصولات کمپانی را افزایش داد . برای اختصاص API metadata، از خصیصه‌های آبجکت Info استفاده می‌کنیم. با استفاده از info می‌توانیم اطلاعات قابل فهم برای کاربر مثل عنوان، توضیحات، اطلاعات تماس و ... را تنظیم کنیم.

خصیصه‌های (property) آبجکت info عبارتند از:

نام

نوع

اجباری

توضیحات

title

string

عنوان اپلیکیشن

Version

string

ورژن(نسخه) API. برای مقداردهی می‌توان از ورژن معنایی مثل 1.0.0 استفاده کرد یا رشته دلخواهی مثل 0.99-beta بکار برد

description

string

 

توضیحات API. متنی دلخواه در قالب html یا markdown

termsOfService

string

 

لینک به صفحه‌ای که شرایط خدمات توضیح داده شده است. مقدار این فیلد باید به فرمت URL باشد

contact

Contact object

 

اطلاعات تماس که شامل خصیصه‌های name، email و url می‌باشد.

name: نام یا اطلاعات متنی. اگر از این خصیصه به تنهایی کاربردی نداردشود. اگر email یا url مقداردهی شده باشند در لینکی که با آدرس email یا url ایجاد می‌کند از مقدار name به عنوان hypertext لینک استفاده می‌شود و اگر name مقداردهی نشده باشد از مقدار پیش‌فرض آن یعنی the developer استفاده می‌شود

 Email: مقداری با فرمت پست الکترونیک دریافت می‌کند. این فیلد به صورت لینک است که با کلیک بر روی آن امکان ارسال نامه به ایمیل ثبت شده وجود دارد

url : آدرس url که لینک آن در خروجی نمایش داده می شود.

license

License object

 

شامل خصیصه‌های license و url می‌باشد.

name: نام license که در صورت استفاده از url به عنوان hypertext لینک به کار می‌رود.

url: آدرس url مربوط به شرح license

externalDocs

   

لینکی به یک داکیومنت خارجی(در صورت وجود) که شامل خصیصه‌های description و url است. Code یا ابزارهای تولید مستندات می‌تواند description را به عنوان متن لینک استفاده کند.

description: توضیح

url: آدرس

آبجکت server :

یک شیء که یک سرور را نشان می دهد.

فیلد‌های ثابت(propertyها)

نام

نوع

اجباری

توضیحات

url

String

یک url به هاست مقصد. این url از متغیرهای سرور پشتیبانی می‌کند و می‌تواند نشبی باشدکه نشان می‌دهد  محل هاست با محلی که داکیومنت OpenAPI ذخیره شده است، مرتبط می‌باشد. جایگزینی متغیر زمانی ایجاد می‌شود که یک متغیر در براکت {} نامگذاری شود.

description

String

 

یک رشته اختیاری برای توصیف هاست طراحی شده با Url. برای نمایش متن از CommonMarl استفاده می‌شود.

variables

Map(string،

شیserver variable)

 

یک نگاشت بین نام متغیر و مقدار آن. مقدار برای جایگزینی در قالب url سرور استفاده می‌شود.

 

Swagger ui:

Swagger ui پارامترهای پیکربندی (configuration) را به چهار روش می‌تواند دریافت کند:

با استفاده از swagger-config.yaml در دایرکتوری ریشه پروژه

آبجکت پیکربندی به صورت یک آرگومان به Swagger ui  ارسال می‌شود (SwaggerUI({.. }))

داکیومنت پیکربندی از یک configUrl خاص واکشی(fetch) می‌شود.

آیتم‌های تنظیمات به صورت جفت های کلید/مقدار (key/value) در رشته پرس‌وجو url ارسال می‌شود.

parameters

پارامترهایی با dot هایی در نام آن‌ها، رشته هایی تک هستند که برای تنظیم پارامترهای زیرمجموعه بکار می‌روند و نشانگر یک ساختار تودرتو نیستند.

برای خوانایی بیشتر، پارمترها بوسیله دسته((category گروهبندی و براساس حروف الفبا مرتب می‌شوند.

نشانه‌گذاری type ها فرمتی مانند زیر دارد:

String = “”       :            به معنی نوع رشته با مقدار پیش‌فرض “” می‌باشد

String=["a"*, "b", "c", "d"]  به این معنی است که نوع رشته می‌تواند مقادیر a،b،c یا d داشته باشد. علامت * مشخص می‌کند که a مقدار پیش‌فرض است.

Core

نام پارامتر

متغیر Docker

نوع

توضیحات

configUrl

CONFIG_URL

String

url برای واکشی (fetch) داکیومنت پیکربندی خارجی

dom_id

DOM_ID

string  

اگر domNode مقداردهی نشده، این پارمترالزامیست. شناسه یک عنصر dom که در آن swaggerUi رابط کاربری را برای swaager قرار می دهد.

domNode

---

element

اگر dom_id مقداردهی نشده، این پارمتر الزامیست. عنصر html dom است که در داخل آن swaggerUi رابط کاربری را برای swaager قرار می دهد. dom_id را overrids می‌کند

spec

spec

Object={}

یک شی js برای توصیف openAPI Specification. زمانی که از این پارامتر استفاده شود ، پارامتر url بررسی (parse) نمی‌شود. این امر برای تست specificationهایی که بصورت دستی بدون میزبانی (hosting) آنها بدست آمده؛ مفید است

url

URL

String 

url که به تعریف API اشاره میکند (عموما swagger.json یا swagger.yml). اگر urls یا spec استقاده شود؛ این پارامتر نادیده گرفته می‌شود.

urls

URLS

Array

یک آرایه از اشیای تعریف API ([{url: "<url1>", name: "<name1>"},{url: "<url2>", name: "<name2>"}]) . بوسیله پلاگین Topbar استفاده می‌شود. وقتی این پارمتر استفاده می‌شود و پلاگین Topbar فعال است، پارامتر url پارس نمی‌شود.Name ها و URL ها باید در تمامی آیتم‌ها در این آرایه یکتا باشند ، به دلیل این‌که به عنوان شناسه‌ها(identifiers) استفاده می‌شوند.

urls.primaryName

URLS_PRIMARY_NAME

String

در مواقعی که از urls استفاده می‌شود، می‌توان از این ساب پارامتر استفاده کرد. اگر این پارمتر باname  یکی از مشخصه‌های (spec) ارائه شده در urls منطبق باشد، آن مشخصه در زمان لود Swagger-UI نمایش داده می‌شود.(به طور معمول درحالت پیش‌فرض اولین مشخصه در urls در زمان لود Swagger-UI نمایش می‌یابد)

 

برای دریافت بصورت PDF کلیک نمایید.