فیسبوک، گوگل، گیتهاب، نتفلیکس و چندین غول دیگر تکنولوژی ، شانس استفاده از اطلاعاتشان را از طریق API ها به دولوپرها و برنامه های شخص ثالث داده اند.
حتی اگر شما برای بقیه دولوپر ها و نرم افزار ها API ارائه نمیدهید، برای برنامه شما خیلی مفیدتر است که API تمیز و زیبایی طراحی کنید.
نحوه درست طراحی یک API یک جر و بحث قدیمی در فضای وب است، و یکی از بزرگترین آنهاست، چون هیچ دستورالعمل رسمی ای برای آن وجود ندارد.
ـ API رابطی است که دولوپر های زیادی از طریق آن به تبادل داده ها میپردازند. یک API خوب همیشه کاربری ساده ای دارد و زندگی دولوپر ها را راحتتر میکند. API یک محیط گرافیکی (GUI) برای دولوپر هاست، اگر گیج کننده باشد آنها دنبال یک جایگزین برای آن خواهند گشت و دیگر از آن استفاده نمیکند. تجربه دولوپری (Developers’ experience) یکی از مهمترین معیار ها برای اندازه گیری کیفیت طراحی API شماست.
اینها از مهمترین اصطلاح (term) های حوزه REST API هستند:
بگذارید برای درک بهتر موضوع چند API برای یک کمپانی با کارمندانش بنویسیم:
برای دریافت لیست همه کارمندان getAllEmployee/
و برای بعضی از کار های معمول دیگر هم لیست زیر را پیاده سازی کردهایم:
/addNewEmployee
/updateEmployee
/deleteEmployee
/deleteAllEmployees
/promoteEmployee
/promoteAllEmployees
و تعداد زیادی endpoint دیگر برای انجام کار های مختلف باید پیاده کنیم، که همه آنها شامل ویژگی های منحصر بفرد زیادی هستند. از این رو نگهداری و تعمیر وقتی تعداد پایانه ها (endpoint) افزایش پیدا میکند بسیار سخت خواهد بود.
مشکل کجاست؟
url طبق تعریف (Uniform Resource Locator / مشخص کننده مکان منبع) باید فقط مشخص کننده مکان یک Resource باشد نه انجام فعلی روی آن. پس وجود و getAll
. . . در URL اشتباه است.
پس روش درست چیست؟
آدرس companies/ مثال مناسبی از روش صحیح است که هیچ فعلی را مستقیم ذکر نکرده است.اما چگونه باید افعال را به سرور بفهمانیم؟ مثلا اینکه میخواهیم لیست کارمندان را دریافت کنیم؟ این کار به عهده HTTP متد هاست (GET, POST, DELETE, PUT) که به آنها verb هم میگوییم.
اسم Resource ها همواره باید بصورت جمع بکار برده شوند؛ و اگر خواستیم به یکی از آنها دسترسی داشته باشیم میتوانیم id مورد نظرمان را در URL ارسال کنیم.
مثال های زیر با فرض این که کارمندان زیر مجموعه ای از کمپانی ها هستند:
GET /companies/3/employees
برای دریافت لیست همه کارکنان کمپانی ۳GET /companies/3/employees/45
برای دریافت اطلاعات کارمند ۴۵ متعلق به شرکت ۳DELETE /companies/3/employees/45
برای حذف کارمند ۴۵ متعلق به شرکت ۳POST /companies
برای ساخت یک کمپانی جدید و دریافت اطلاعات کمپانی ساخته شده
حالا API ما تمیز و درست حسابی شد!?
نتیجه این که: آدرس ها باید شامل اسم های جمع Resource ها باشند، و HTTP متد ها فعل انجام شده روی Resource را مشخص کنند.
ـ HTTP تعدادی متد تعریف شده دارد که مشخص میکنند چه فعلی روی Resource مورد نظر اعمال میشود.
ـ URL یک جمله است؛ Resource ها اسم های آن و HTTP متد ها فعل های آن هستند.
متد های پر استفاده تر HTTP به قرار زیر اند:
companies/3/employees/
اطلاعات مربوط به کارمندان کمپانی ۳ را برمیگرداند. ( این عمل نباید هیچ تاثیر جانبی دیگری بر سیستم داشته باشد.)companies/3/employees/
یک کارمند جدید از کمپانی ۳ ایجاد میکند.companies/3/employees/john/
ـ john را در زیر مجموعه کارکنان کمپانی ۳ ویرایش میکند و در صورت عدم وجود آنرا میسازد./companies/3/employees/john/
باعث حذف john از لیست کارمندان کمپانی ۳ میشود.وقتی که کلاینت درخواستی از سرور میکند باید بتواند به راحتی از وضعیت درخواستش مطلع شود، که درخواستش موفق ،ناموفق و یا غلط بوده است. کد های وضعیت HTTP سریال هایی برای سناریو های مختلفی است که ممکن است روی دهد. سرور همیشه باید کد وضعیت درست را به کلاینت برگرداند.
در ادامه به معرفی دسته های مختلف کد های وضعیت HTTP میپردازیم:
حالت موفق - 2XX
این دسته کد های وضعیت به معنای دریافت درخواست توسط سرور و موفقیت پردازش مورد نظر است:
حالت ریدایرکت - 3XX
حالت کلاینت ارور - 4XX
این حالت هنگامی رخ میدهد که درخواستی معیوب از سمت کاربر ارسال شود:
حالت سرور ارور - 5XX
شما میتوانید از هر قاعده نام گذاری (naming convention) ای که میخواهید پیروی کنید.اما حتما این قاعده را در تمام سطح API رعایت کنید. اگر از JSON برای بدنه درخواست یا پاسخ استفاده میکنید سعی کنید که از Camel Case استفاده کنید.
همه این کار ها با کوئری زدن روی دیتاست ها انجام پذیر اند؛ و نیازی به طراحی API مجزا ندارند. کافیست پارامتر هایی به URL خود اضافه کنیم و توسط همان متد GET آنرا درخواست دهیم. بگذارید با چند مثال قضیه را روشن تر کنیم:
GET /companies
باید بتواند پارامتر های مختلفی را قبول کند مثل :GET /companies?sort=rank_asc
که لیست کمپانی ها را بر اساس رنکینگ بصورت صعودی برمیگرداند.GET /companies?category=banking&location=india
بانک هایی که در هند مستقر هستند را برمیگرداند.GET /companies?search=Digital Mckinsey
که اطلاعات کمپانی دیجیتال مکنزی را برمیگرداند.GET /companies?page=23
کمپانی های بخش ۲۳ را برمیگرداند.نکته: وقتی تعداد پارامتر های ارسالی بالارود و طول URL بیش از حد شود، ممکن است سرور کد 414 URI Too Long بدهد. در این موارد میتوانید دیتای مورد نظر را در بدنه درخواست POST قرار دهید.
وقتی API شما در حال استفاده است، بهبود دادن آن و تغییر ساختار آن ممکن است در عملکرد نرم افزار هایی که از API شما استفاده میکنند مشکل ایجاد کند. این URL یک نمونه مناسب از API است: http://api.yourservice.com/v1/companies/34/employees
که عدد ورژن به صراحت در URL ذکر شده است. اگر تغییر اساسی در API شما انجام شد باید ورژن جدیدی از API منتشر کنید. برای مثال از v2 یا v1.x.x استفاده کنید.
پایان
این یادداشت ترجمه آزادی بود از:
در صورتی که آن را دوست داشتید از لایک و اشتراک گذاری دریغ نکنید.