درخواست و دریافت داده از منابع اینترنتی، یکی از اصول اولیه برنامه نویسی است. اما در اکثر دوره های آموزشی “Learn to Code <زبان برنامه نویسی>” تدریس نمیشود. به عنوان یک برنامه نویس خودآموخته، API یکی از مهارتهایی است که به شما کمک میکند تا در مسیر یادگیری خود پیش بروید و شما را از 90 درصد برنامه نویسان دیگر جلو میاندازد.
API چیست؟
API مخفف Application Programming Interface (رابط کاربری برنامه نویسی اپلیکیشن) است. این رابط به برنامه کمک میکند تا اطلاعات را از منابع مختلف اینترنتی fetch کند.
فرض کنید در حال ساخت یک برنامه ابتدایی تبدیل ارز در پایتون هستید. این برنامه مقدار ورودی X را می گیرد و آن را به ارز Y تبدیل میکند. کد نمونه برای ارجاع:
def currency_converter ():
currency_a = input ("Enter the currency you want to convert: ")
currency_b = input ("Enter the currency you want to convert to: ")
amount = float (input ("Enter the amount you want to convert: "))
exchange_rate = float (input ("Enter the exchange rate: "))
print(f"{amount} {currency_a} is equal to \
{amount * exchange_rate} {currency_b}")
currency_converter ()
این برنامه در شکل کنونی خود چیزی بیش از یک ماشین حساب ضعیف نیست، و به عنوان یک برنامه کاربرد زیادی ندارد. اینجاست که API ها وارد عمل میشوند!!
با چند خط کد می توان این برنامه را آنقدر قدرتمند ساخت که نیازی به درخواست نرخ ارز نداشته باشد. در عوض، با APIها، کد میتواند خود نرخ ارز فعلی را fetch کند و آن را در اختیار برنامه قرار دهد.
آیا نیاز به ساخت برنامهای برای دادن کد کشور برای یک کشور ورودی دارید؟ یک API برای آن وجود دارد.
نیاز به موجودی انبار داده (Data warehouse) خود دارید؟ یا دادههای صفحه گسترده تان را میخواهید؟ تاییدیه پرداخت؟ ناتیفیکیشن ایمیل؟
همه اینها با API به سادگی انجام میشود!
به بیان ساده، APIها ارتباطات بین دستگاههای محاسباتی را به شیوه ای استاندارد امکان پذیر میکنند.
به عنوان مثال، اگر به آلمان میروید و از یک Interpreter برای کمک در امر ترجمه استفاده میکنید، مترجم همان API است.
اجزای یک API
یک API دارای 3 عنصر است: درخواست، پاسخ و منبع. (Request, Response, Resource)
- درخواست (Request) – شما از مترجم میخواهید که به یک آلمانی “روز بخیر” بگوید، این درخواست شما است.
- پاسخ (Response) – آنچه فرد آلمانی در پاسخ به شما میگوید پاسخ است.
- منبع (Resource) – داده های درون پاسخ (“Guten Tag”) منبع است.
در برنامه بالا، بیایید ببینیم API باید چه کاری انجام دهد:
"""
Request -- Our program requests for the currency_a -> currency_b exchange rate
Response -- API endpoint reads our request, fetches that information, and responds back
Resource -- The exchange rate data sent back is the resource
"""
API Endpoint چیست؟
همانطور که در حال حاضر (بهعنوان برنامه نویسان خودآموخته) میدانیم که کامپیوترها به ورودیهای بسیار دقیق و به روشی بسیار دقیق نیاز دارند، باید بدانیم که هر گونه انحراف یا هر انتظاری از کامپیوتربرای “درک چیزها همانطور که ما انجام میدهیم” فقط منجر به بههمریختگی میشود!
در این راستا، ما باید درک کنیم که حتی درخواستهای API نیز باید به روشی بسیار دقیق ساختاردهی شوند.
ساختار کلی یک API به این صورت است:
- API Endpoint – این متغیر همان URL است که درخواست را دریافت میکند.
- Method – این متغیر بیانگر نوع درخواست API است و انواع مختلفی دارد مانند:
- GET — نشان میدهد که درخواست (Request) به دنبال دریافت اطلاعات از سرور است.
- POST — نشان میدهد که درخواست (Request) به دنبال ارسال برخی اطلاعات به یک سرور است.
- DELETE — نشان میدهد که درخواست (Request) به دنبال حذف برخی از اطلاعات از سرور است.
- PUT/PATCH — نشان میدهد که درخواست (Request) به دنبال بهروزرسانی اطلاعات موجود در سرور است.
- Header – زمینهای درمورد منبعی که درخواست داده، ارائه میدهد.
- Body — این بخش اصلی درخواست (Request) است که پاسخ (Response) را تحریک میکند.
پاسخهای CRUD (CRUD Responses)
CRUD مخفف Create, Read, Update, Delete است و با استفاده از API method مربوطه در درخواست API انجام می شود:
توضیحات |
Response |
API Method |
اطلاعات موجود را از سرور fetch میکند. |
Read |
GET |
اطلاعات را به سرور اضافه میکند. |
Create |
POST |
اطلاعات روی سرور را حذف میکند. |
Delete |
DELETE |
اطلاعات سرور را بهروزرسانی میکند. |
Update |
PUT/PATCH |
fetch کردن نرخهای ارز Realtime در برنامه ما
اکنون ما به اندازه کافی آماده هستیم که نرخ ارزهای لحظهای (Realtime) را در برنامه نمونه خود که قبلاً ارائه شد، دریافت کنیم. ما از ماژول Requests برای این تمرین استفاده میکنیم که میتوانید آن را از طریق درخواستهای نصب pip3 در ترمینال ویرایشگر کد خود (مانند VSCode) دریافت کنید.
APIهایی که دادهها را ارائه میکنند، بسته به سهولت استفاده، به صورت رایگان و پولی ارائه میشوند. من یک ExchangeRateAPI با منبعرایگان پیدا کردم و از آن استفاده میکنم، زیرا تا زمانی که آن را در اینجا تست میکنم، مجبورم نمیکند ثبت نام کنم.
داده های API معمولاً به شکل JSON (بسیار شبیه به یک دیکشنری در پایتون) و برای تفسیر آسان توسط برنامه نویسانی که آن دادهها را fetch می کنند ارائه میشود. در اینجا کد دریافت قیمت فعلی دلار در آمریکا از طریق API آمده است.
import requests
url = "https://open.er-api.com/v6/latest/USD"
r = requests.get(url)
data = r.json()
print (data)
با اجرای این کد، خروجی زیر را دریافت خواهیم کرد:
{'result': 'success',
'provider': 'https://www.exchangerate-api.com',
'documentation': 'https://www.exchangerate-api.com/docs/free',
'terms_of_use': 'https://www.exchangerate-api.com/terms',
'time_last_update_unix': 1666828952,
'time_last_update_utc': 'Thu, 27 Oct 2022 00:02:32 +0000',
'time_next_update_unix': 1666916222,
'time_next_update_utc': 'Fri, 28 Oct 2022 00:17:02 +0000',
'time_eol_unix': 0,
'base_code': 'USD',
'rates': {'USD': 1, 'AED': 3.6725, 'AFN': 87.825832, 'ALL': 118.121569,
'AMD': 400.945057, 'ANG': 1.79, 'AOA': 469.341287, 'ARS': 155.541325, 'AUD': 1.541873,
'AWG': 1.79, 'AZN': 1.703727, 'BAM': 1.945846, 'BBD': 2, 'BDT': 101.652423,
'BGN': 1.946569, 'BHD': 0.376, 'BIF': 2061.89311, 'BMD': 1, 'BND': 1.40599,
'BOB': 6.931975, 'BRL': 5.314395, 'BSD': 1, 'BTN': 81.988812, 'BWP': 13.376498,
'BYN': 2.887549, 'BZD': 2, 'CAD': 1.355432, 'CDF': 2080.191892, 'CHF': 0.986916,
'CLP': 967.707002, 'CNY': 7.181598, 'COP': 4992.818412, 'CRC': 624.374829, 'CUP': 24,
'CVE': 109.702113, 'CZK': 24.428037, 'DJF': 177.721, 'DKK': 7.422296, 'DOP': 53.948303,
'DZD': 140.691654, 'EGP': 19.734057, 'ERN': 15, 'ETB': 53.10939, 'EUR': 0.994984,
'FJD': 2.280573, 'FKP': 0.862476, 'FOK': 7.422296, 'GBP': 0.862495, 'GEL': 2.780813,
'GGP': 0.862476, 'GHS': 14.477856, 'GIP': 0.862476, 'GMD': 60.196663,
'GNF': 8658.722933, 'GTQ': 7.851475, 'GYD': 210.222337, 'HKD': 7.848858,
'HNL': 24.756699, 'HRK': 7.496037, 'HTG': 127.760311, 'HUF': 407.402111,
'IDR': 15518.182729, 'ILS': 3.502567, 'IMP': 0.862476, 'INR': 81.991335,
'IQD': 1466.589463, 'IRR': 42121.422024, 'ISK': 142.934149, 'JEP': 0.862476,
'JMD': 153.171604, 'JOD': 0.709, 'JPY': 146.478104, 'KES': 121.814832,
'KGS': 83.278965, 'KHR': 4159.804229, 'KID': 1.541816, 'KMF': 489.456326,
'KRW': 1414.443423, 'KWD': 0.29963, 'KYD': 0.833333, 'KZT': 470.670656,
'LAK': 17297.850805, 'LBP': 1507.5, 'LKR': 362.205766, 'LRD': 154.022883,
'LSL': 17.964161, 'LYD': 5.043916, 'MAD': 10.860577, 'MDL': 19.373927,
'MGA': 4262.390442, 'MKD': 61.999441, 'MMK': 2425.598271, 'MNT': 3414.010756,
'MOP': 8.084315, 'MRU': 38.145372, 'MUR': 43.95057, 'MVR': 15.474793,
'MWK': 1033.698319, 'MXN': 19.911183, 'MYR': 4.709804, 'MZN': 64.481751,
'NAD': 17.964161, 'NGN': 437.991325, 'NIO': 36.062907, 'NOK': 10.27411,
'NPR': 131.1821, 'NZD': 1.717982, 'OMR': 0.384497, 'PAB': 1, 'PEN': 3.994793,
'PGK': 3.535979, 'PHP': 58.319524, 'PKR': 220.984121, 'PLN': 4.728217,
'PYG': 7249.701869, 'QAR': 3.64, 'RON': 4.844272, 'RSD': 116.906933,
'RUB': 61.346183, 'RWF': 1075.383068, 'SAR': 3.75, 'SBD': 8.07199, 'SCR': 13.126076,
'SDG': 572.688874, 'SEK': 10.875131, 'SGD': 1.405948, 'SHP': 0.862476,
'SLE': 17.636956, 'SLL': 17636.95595, 'SOS': 571.245973, 'SRD': 29.467417,
'SSP': 611.916602, 'STN': 24.374931, 'SYP': 2514.92413, 'SZL': 17.964161,
'THB': 37.747911, 'TJS': 10.200292, 'TMT': 3.504191, 'TND': 3.085688,
'TOP': 2.388017, 'TRY': 18.607129, 'TTD': 6.77608, 'TVD': 1.541816,
'TWD': 32.049926, 'TZS': 2335.14976, 'UAH': 37.234725, 'UGX': 3826.845217,
'UYU': 41.283595, 'UZS': 11139.838897, 'VES': 8.4508, 'VND': 24821.263771,
'VUV': 122.039898, 'WST': 2.787278, 'XAF': 652.608434, 'XCD': 2.7, 'XDR': 0.774448,
'XOF': 652.608434, 'XPF': 118.722827, 'YER': 251.106608, 'ZAR': 17.964381,
'ZMW': 16.127703, 'ZWL': 644.87339}}
با نگاهی به این JSON (از اینجا به دلایل پایتونیک آن را دیکشنری مینامیم)، میبینیم که نرخ ارز در برابر دلار به عنوان ارز پایه در دیکشنری داخلی آورده شده است. که با کلید نرخها (Rates key) قابل دسترسی است.
و با استفاده از کد ارز 3 حرفی مربوط به ارز مورد نظر، (USD,EUR,…) می توان به نرخ واقعی تبدیل به یک ارز خاص دسترسی پیدا کرد.
به عنوان مثال، برای دریافت نرخ تبدیل به INR (روپیه هند)، ابتدا باید از Rates key و سپس کلید INR در Rates key استفاده کنم.
کد دریافت نرخ تبدیل USD به INR، در پایتون به این شکل است:
inr_rate = data['rates'].get('INR', 'Not Found')
بیایید اکنون کد اصلی خود را به روز کنیم تا یک ماشین حساب نباشیم و به جایش یک کامپیوتر باشیم! :
import requests
def currency_converter ():
currency_a = input ("Enter the currency you want to convert: ")
currency_a = currency_a.upper()
#accepts user input for base currency name and converts it to uppercase
currency_b = input ("Enter the currency you want to convert to: ")
currency_b = currency_b.upper()
#accepts user input for final currency name and converts it to uppercase
currency_converter_api = "https://open.er-api.com/v6/latest/" + currency_a
#makes currency_a the base currency
api_response = requests.get(currency_converter_api)
#fetches the api response - the R from CRUD
api_response_json = api_response.json()
#Converts the response object into a JSON object
amount_to_convert = float (input (f"Enter the amount of {currency_a} \
you want to convert to {currency_b}: "))
#accepts user input for the amount to convert as a float
try:
exchange_rate = api_response_json['rates'].get(currency_b, \
'Currency Not Supported by API')
if exchange_rate == 'Currency Not Supported by API':
print ("Final Currency Not Supported by API")
else:
converted_amount = amount_to_convert * exchange_rate
print (f"{amount_to_convert} {currency_a} is \
equal to {converted_amount} {currency_b}")
except KeyError:
print ("Base Currency Not Supported by API")
# for catching errors is the base currency name is not supported by the API
currency_converter ()
اکنون کمی بهتر میشود:
1- تبدیل 5000 روپیه هند (INR) به یورو (EUR) (محاسبه تبدیل موفق):
"""
Enter the currency you want to convert: inr
Enter the currency you want to convert to: eur
Enter the amount of INR you want to convert to EUR: 5000
5000.0 INR is equal to 60.72 EUR
"""
2- تبدیل ارز پشتیبانی نشده (error-handling):
"""
Enter the currency you want to convert: utsav
Enter the currency you want to convert to: inr
Enter the amount of UTSAV you want to convert to INR: 45
Base Currency Not Supported by API
"""
3- تبدیل به ارز پشتیبانی نشده (error-handling):
"""
Enter the currency you want to convert: inr
Enter the currency you want to convert to: utsav
Enter the amount of INR you want to convert to UTSAV: 89
Final Currency Not Supported by API
"""
نکات پایانی:
در حالی که ما در اینجا به دلایل واضحی از دستورات چاپی (Print Statements) استفاده کردیم، اگر برنامهای میسازید، از دستورات چاپی خودداری کنید و به جای آن از بازگشت (Return) استفاده کنید.
برخی از APIهای پریمیوم (پولی) منابع بهتری ارائه میدهند، و توانایی دریافت ورودی هایی با نام کامل (Indian Rupee) یا فقط با نام کشور به عنوان ورودی (USA) و پاسخگویی با پاسخ دلخواه شما را دارند.
اکثر APIها به استفاده از کلیدهای API (API keys) برای احراز هویت و ویژگیهای پیشگیری از DDoS نیاز دارند. در این مورد میتوانید در این مقاله (انگلیسی) بیشتر بخوانید.
Leave feedback about this