در این مقاله قصد داریم به معرفی مفاهیم API و RESTful API پرداخته و همچنین نحوۀ برقراری ارتباط با یک سرویس تحت وب را در پایتون با استفاده از ماژول Requests بررسی کنیم.
API مخفف کلمۀ Application Programming Interface است که به طور کلی میتوان گفت اینترفیس نمای بیرونی و مرز مشترک میان دو چیز است. به طور مثال، User Interface یا به اختصار UI به مرز مشترک میان یک برنامه یا سیستمعامل و یک کاربر واقعی اشاره میکند (کاربر در سیستمعامل داس با نوعی رابط کاربری که شبیه متن بود سر و کار داشت ولی در ویندوز با پنجرهها کار میکند.) حال با همین تعریف هم API به مرز مشترک میان دو اپلیکیشن اشاره میکند؛ به عبارت دیگر، هنگامی که میخواهیم یک اپلیکیشن طراحی کنیم، نحوۀ تعامل اپلیکیشن با سایر اپلیکیشنها به عهدۀ API خواهد بود.
آشنایی با مفاهیم Web API و RESTful API
Web API در واقع یک ایپیآی میباشد که در قالب اپلیکیشنهای تحت وب پیادهسازی شده و با استفاده از آن میتوان اجازه داد تا برنامههای دیگر با یکسری پارامترهای خاص به ایپیآی مذکور متصل شده و یک خروجی با یک فرمت مشخص از آن بگیرند که از جملهٔ مهمترین آنها میتوان به API شبکههای اجتماعی فیسبوک، توئیتر، اینستاگرام، تلگرام و ... اشاره کرد.
در پاسخ به این پرسش که مزایای استفاده از ایپیآیهای وب چیست؟ شاید بتوان گفت مهمترین دلیل بلادرنگ و آپدیت بودن دیتاهای استخراج شده باشد و دلیل بعدی را میتوان عدم ذخیرهسازی دادههای حجیم دانست چرا که شما فقط دیتایی که احتیاج دارید را فراخوانی میکنید.
RESTful برگرفته از کلمۀ Representational State Transfer، در واقع یکی از انواع معماریهای طراحی API است که در سالهای اخیر به محبوبیت زیادی رسیده است به طوری که در معماری RESTful کلاینت شبیه یک مرورگر درخواست خود را در قالب پروتکل HTTP و با متدهای قابلفهم برای مرورگر مانند GET ،POST ،PUT ،DELETE و ... به سمت سرور مد نظر میفرستد و پاسخی دریافت میکند که عموماً این پاسخ به صورت JSON یا XML است (در مقابل RESTful API استاندارد جدیدی تحت عنوان GraphQL عرضه شده که برای کسب اطلاعات بیشتر میتوانید به مقالهٔ How to GraphQL: خودآموزی جامع برای یادگیری GraphQL مراجعه نمایید.)
استفاده از ماژول Requests در پایتون
در پایتون برای اینکه بتوانیم با یک API یا وب سرویس ارتباط برقرار کنیم، از ماژول Requests برای ارسال درخواستهای HTTP استفاده میکنیم اما در عین حال ماژولهای دیگری مثل Urllib که به صورت اصطلاحاً Built-In در خودِ زبان برنامهنویسی پایتون هستند نیز میتوان استفاده نمود که کار با آنها به سادگی ماژول Requests نیست. برای کار با ماژول Requests، ابتدا باید آن را به صورت زیر نصب کنیم:
$ pip install requests
برای اطمینان از نصب این ماژول، به صورت زیر در کنسول آن را import میکنیم:
import requests
اگر اروری مشاهده نشد، این بدان معنا است که ماژول Requests به درستی نصب شده است. حال فرض کنیم که میخواهیم یک درخواست از جنس GET به یک لینک دلخواه خود فرستاده و پاسخ را بررسی کنیم:
import requests
req = requests.get('https://github.com/timeline.json')
درخواست GET به صفحۀ تایملاین گیتهاب فرستاده شده است (گویی در مرورگر لینک مذکور را باز کرده باشیم.) و پاسخ را در متغیری تحت عنوان req ذخیره کردهایم و حال میتوان با استفاده از متدهای مختلف، اطلاعات دلخواهمان را کسب کنیم. به طور مثال خواهیم داشت:
req.text
u'{"message":"Hello there, wayfaring stranger. If you\u2019re reading this then you probably didn\u2019t see our blog post a couple of years back announcing that this API would go away: http://git.io/17AROg Fear not, you should be able to get what you need from the shiny new Events API instead.","documentation_url":"https://developer.github.com/v3/activity/events/#list-public-events"}
با استفاده از متد text میتوانیم محتوای صفحه را مشاهده کنیم و یا با:
req.json()
{u'documentation_url': u'https://developer.github.com/v3/activity/events/#list-public-events', u'message': u'Hello there, wayfaring stranger. If you\u2019re reading this then you probably didn\u2019t see our blog post a couple of years back announcing that this API would go away: http://git.io/17AROg Fear not, you should be able to get what you need from the shiny new Events API instead.'}
میتوان همۀ اطلاعات صفحه را به صورت جیسون درآورد و یا با استفاده از متد encoding به صورت زیر:
req.encoding
'utf-8'
میتوان فرمت encoding صفحه را مشاهده کرد. ماژول Requests در پایتون همچنین شامل متدهای POST و PUT نیز میباشد که از POST برای ایجاد یک آبجکت جدید و از PUT برای ویرایش و آپدیت آبجکتهایی استفاده میشود که قبلاً ایجاد شدهاند. به عنوان مثال داریم:
r = requests.post('http://127.0.0.1/api/v1/add_item', data = {'task':'Shopping'})
r = requests.put('http://127.0.0.1/api/v1/add_item', data = {'task':'Shopping at 2'})
و در آخر باید گفت که Requests شامل امکانات متنوع دیگری همانند متدهای Authentication نیز میباشد که جزو کاربردهای حرفهایتر این ماژول محسوب میشوند.