یکی از بخشهای لاینفک وب مدرن، ای پی آی ها، بهکارگیری از آنها، توسعه ی آنها و مهم از همه معماری RESTful API است که هر توسعهدهنده ی وب اپلیکیشنی، باید با سازوکار آن آشنایی داشته باشد که در این آموزش قصد داریم نگاهی کلی به مفهوم رستفول ای پی آی داشته باشیم.
REST مخفف واژگان Representational State Transfer است که از سال ۲۰۰۵ در وب شناخته شد که در ظاهر کمی گیجکننده به نظر میرسد، اما با کمی توضیح، میتوان این مفهوم در ظاهر پیچیده را رمزگشایی کرد!
اگر خیلی ساده بخواهیم به این قضیه نگاه کنیم، REST عبارت است از راه کارها و روشهایی که با استفاده از آنها میتوان به رد و بدل دیتا از طریق شبکه پرداخت. به عبارت دیگر، REST راهی ساده به منظور سازماندهی تعاملات مابین سیستمهای مجزا از یکدیگر میباشد.
در مقابل REST، پروتکل SOAP که مخفف واژگان Simple Object Access Protocol است قرار دارد که از طریق آن میتوان به رد و بدل دیتا از طریق شبکه در قالب وب سرویس های مختلفی با فرمت XML پرداخت.
API هم مخفف واژگان Application Programming Interface است که دربرگیرنده ی متدهایی برای ارتباط با سایر لایبرری ها یا اپلیکیشن ها است.
حال اگر این اصطلاحات در کنار یکدیگر قرار دهیم و چیزی تحت عنوان RESTful API بسازیم، منظورمان سازوکارهایی برای ارتباط با سایر سرویس ها با استفاده از معماری خاصی است. معماری REST دارای یکسری ویژگیها است که شاخص ترین آنها عبارتند از:
- ثبات و یکنواختی این معماری در جای جای API
- عدم برخورداری از سشن در سمت سرور
- بهکارگیری از کدهای وضعیت اچ تی تی پی
- استفاده از یو آر ال ها برای مشخص ساختن مسیرهای مد نظر
- اِعمال کوئری ها در یو آر ال به جای هدر پروتکل اچ تی تی پی
با این تفاسیر، RESTful API ها به خدمت توسعهدهندگان وب آمدهاند تا فرایند توسعه ی وب، ایجاد تجربه ی کاربری بهتر، سهولت در استفاده از ای پی آی ها و نقل و انتقال دادهها از طریق پروتکل اچ تی تی پی را امکانپذیر سازند.
علاوه بر این، توجه داشته باشیم که REST بیش از آنکه پروتکل باشد، یکسری راهنما، اصول و قواعدی است که با استفاده از آنها میتوانیم به برقراری ارتباط مابین منابع مختلف بپردازیم.
حال برای درک بهتر این موضوع، مثالی عملی میزنیم. فرض کنیم که قصد داریم از ای پی آی شبکه ی اجتماعی توییتر برای نشان دادن محبوبترین توییت ها در وبسایت خود استفاده کنیم. در چنین شرایطی، ما بدون آن که دسترسی به سرور این شبکه ی اجتماعی داشته باشیم، قادر خواهیم بود تا دیتای مد نظر خود را گرفته و در معرض دید کاربرانمان قرار دهیم. معمولاً سرویس هایی که API در اختیار توسعهدهندگان قرار می دهند، دیتای مد نظر را در فرمت JSON در اختیار آنها قرار میدهند البته برخی سرویس ها هم هستند که از فرمت XML استفاده می کنند.
HTTP چیست؟
پیش از نگاهی عمیقتر به رستفول ای پی آی، باید با مفهوم اچ تی تی پی آشنا شویم. به طور کلی، HTTP به پروتکلی اشاره دارد که از آن طریق میتوان در بستر وب به نقل و انتقال دیتا پرداخت. در اینجا منظور از پروتکل هم یکسری اصول و قواعدی است که مشخص میسازند چه پیامهایی قابل انتقال هستند و کدام یک از آنها باید در پاسخ به دیگری ارسال شوند. برای اجرایی شدن پروتکل اچ تی تی پی، نیاز به یک کلاینت و یک سرور داریم؛ معمولاً منظور از کلاینت، مرورگری است که با استفاده از آن وبگردی میکنید که این مرورگر معمولاً آغاز کننده ی ارتباط از طریق این پروتکل است.
پیامهایی از جنس اچ تی تی پی حاوی دو بخش هستند که یکی Body نام دارد و دیگری Header. دیتایی که شما قصد دارید از طریق مرورگر خود برای سرور ارسال کنید -مثلا نام کاربری و رمزعبور که وارد فرم لاگین میکنید- در بخش Body قرار میگیرند. Header هم دربرگیرنده ی یکسری متادیتا مثل Encoding، متدهای اچ تی تی پی و غیره است که این متادیتا ها مشخص کننده ی این مسئله هستند که دیتای قرار گرفته در Body به شکل میباید هندل شود.
در صورتی که از گوگل کروم استفاده میکنید، با فشردن همزمان کلیدهای Ctrl + Shift + J میتوانید پنجره ی Chrom Developer Tools را باز کرده وارد تب Network شوید و همانطور که به گشت زنی در وب می پردازید، میتوانید جزئیات هدر و بادی پروتکل HTTP را رصد کنید. در صورتی هم که از مرورگر فایرفاکس استفاده میکنید، با نصب افزونه ی Firebug میتوانید به چنین قابلیتی دست یابید.
راهکار دیگری که از آن طریق میتوانید با درخواست های اچ تی تی پی آشنا شوید، ابزاری است تحت عنوان cURL که یک ابزار کامند لاین است که در اکثر سیستمعامل های مطرح مثل ویندوز، مک و لینوکس در دسترس است. به طور مثال، پس از نصب این ابزار در لینوکس، میتوانید در ترمینال دستور زیر را تایپ کنید:
curl -v https://sokanacademy.com
و خواهید دید که محتوای صفحه ی هوم پیج سکان آکادمی در ترمینال لود میشود (علاوه بر کامند لاین بودن cURL، از آن میتوان به عنوان یک لایبرری برای اکثر زبانهای برنامهنویسی من جمله PHP نیز استفاده کرد.)
HTTP Verbs
حال ممکن است این سؤال پیش بیاید که چگونه میتوان اکشن یا عملکردی برای درخواستی که از طریق پروتکل اچ تی تی پی ارسال میکنیم تعریف نماییم؟ در پاسخ به این سؤال باید گفت که در اینجا باید با مفهومی تحت عنوان HTTP Verbs آشنا شویم که نام دیگرش HTTP Methods است که پیش از این به طور مفصل در مورد آنها صحبت کردهایم. هر درخواست از جنس اچ تی تی پی، حاوی متدی است که در بخش هدر قرار میگیرد. به طور مثال:
GET / HTTP/1.1
این دستور حاکی از آن است که متد GET که پیش از این با آن آشنا شدیم برای فراخوانی اطلاعات مورد استفاده قرار گرفته است. به عبارت دیگر، متدهای اچ تی تی پی به سرور دستور میدهند که با دیتایی که از طریق یو آر آل برای سرور ارسال میکنید چه کاری انجام دهند؛ مثلاً آیا رکورد خاصی را حذف کنند یا آن را آپدیت کنند و …
برای بهکارگیری از RESTful API، چهار متد پیش رو داریم که عبارتند از:
- GET: برای دریافت یک آبجت
- POST: برای ساخت و ارسال یک آبجکت
- PUT: برای تغییر و جایگزین کردن یک آبجکت
- DELETE: برای حذف یک آبجکت
که در اینجا منظور از آبجکت، یک درخواست یا کوئری به سرور است. اکثر ای پی آی های تحت وب که اطلاعاتی را به رایگان در اختیار توسعهدهندگان قرار میدهند معمولاً فقط و فقط امکان استفاده از متد GET را به توسعهدهنده میدهند تا دیتای خاصی را از سرور ارائه دهنده ای پی آی مد نظر دریافت کنند چرا که این متد اصلا تهدیدی برای سرویس ارائه دهنده ی API محسوب نمیگردد زیرا توسعهدهنده فقط میتواند اصطلاحا Read کند و اجازه ی Write کردن روی دیتابیس را ندارد.
برخی از وب اپلیکیشنهایی هم که امکان استفاده از سایر متدها همچون PUT و DELETE را به توسعهدهندگان می دهند، پیش از عملی ساختن هر گونه درخواستی از طرف توسعهدهنده ، اقدام به تصدیق اطلاعات توسعهدهنده (Authentication) میکنند که چنین قابلیتی نیاز به ثبتنام در سرویس مد نظر، گرفتن یک شناسه ی اختصاصی و … دارد.
متد GET سادهترین و پرکاربردترین متد استفاده شده در پروتکل اچ تی تی پی است. به طور کلی، هر وقت که شما روی لینکی در سکان آکادمی کلیک میکنید، این متد از طریق هدر پروتکل اچ تی تی پی برای سرور این سایت ارسال میشود. این متد به سرور دستور میدهد تا اطلاعات مرتبط با آدرس لینکی که روی آن کلیک شده است را برای مرورگر شما ارسال کند.
پیش از این گفتیم که پروتکل اچ تی تی پی دارای دو بخش هدر و بادی است؛ هدر حاوی متادیتاها است که صرفاً میتواند حاوی Plain Text یا «متن خالی» باشد که با فرمت خاصی نوشته میشوند اما بادی این پروتکل میتواند حاوی دیتایی با هر فرمتی باشد. از متن خالی گرفته تا تصاویر، کدهای اچ تی ام ال، اکس ام ال، جسون و غیره.
زمانی که مرورگر درخواستی را برای سرور ارسال میکند، اگر همه چیز به درستی اتفاق بیافتد، سرور پاسخی را برای مرورگر (کلاینت) ارسال میکند. حال برای اینکه این پاسخ قابل درک برای مرورگر باشد، باید در بخش هدر پاسخ سرور، Content Type یا «نوع محتوا» بادی مشخص شود که این کار در هدر پاسخ صورت میگیرد:
Content-Type: text/html
در مثال فوق، پاسخ ارسال شده از سمت سرور در قالب فایل اچ تی ام ال ارسال شده است.