
API для начинающих: запросы, ответы, ресурсы и GET объясняются с помощью кода
27 октября 2022 г.
Запрос и получение данных из интернет-источников — одна из основ программирования, но этому не учат в большинстве курсов «Изучение кода
Что такое API?
API, сокращенно от Application Programming Interface, помогает программе получать информацию из различных интернет-источников.
Допустим, вы создаете базовую программу конвертации валюты на Python. Он принимает входную сумму в валюте 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 код сможет получать текущий обменный курс и предоставлять его программе.
Нужно сделать программу, чтобы дать код страны для страны ввода? Для этого есть API.
Товар на вашем складе? Данные в вашей электронной таблице? Подтверждение об оплате? Уведомление по электронной почте?
Все сделано с помощью API!
Проще говоря, API обеспечивают стандартизированное взаимодействие между вычислительными устройствами.
Например, если вы отправляетесь в Германию и используете переводчика для помощи в переводе, переводчиком будет API.
Компоненты API
API состоит из трех элементов: запроса, ответа и ресурса.
* Просьба. Вы просите переводчика сказать «Добрый день» немцу. * Ответ - То, что сказал немец, является ответом * Ресурс — данные в ответе («Тег Guten») являются ресурсом
В нашей программе выше давайте посмотрим, что должен делать 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? Что это?
Как мы уже знаем (как программисты-самоучки), компьютеру нужны очень точные входные данные очень точным образом. Любое отклонение или любое ожидание от компьютера того, что он «понимает вещи так, как мы», приведет к хаосу!
В связи с этим мы должны понимать, что даже запросы API должны быть очень точно структурированы.
Вот как выглядит общая структура API:
* Конечная точка API — это URL-адрес, который получает запрос.
* Метод — это тип запроса API, который бывает нескольких типов, например:
* GET — указывает, что запрос пытается получить информацию с сервера. * POST — указывает, что запрос пытается отправить некоторую информацию на сервер. * DELETE — указывает, что запрос пытается удалить некоторую информацию с сервера. * PUT/PATCH — указывает, что запрос пытается обновить существующую информацию на сервере.
- Заголовок – дает некоторый контекст о запрошенном ресурсе.
* Тело – это основная часть запроса, которая инициирует ответ.
Ответы CRUD
CRUD означает создание, чтение, обновление и удаление и выполняется с использованием соответствующего метода API в запросе API:
| Метод API | Ответ | Описание | |----|----|----| | ПОЛУЧИТЬ | Читать | получает существующую информацию с сервера | | ПОСТ | Создать | добавляет информацию на сервер | | УДАЛИТЬ | Удалить | удаляет информацию о сервере | | ПОСТАВИТЬ/ИСПРАВИТЬ | Обновить | обновляет информацию на сервере |
Получение курсов валют в реальном времени в нашу программу
Теперь мы достаточно готовы для загрузки курсов валют в режиме реального времени в наш образец программы, представленный ранее. В этом упражнении мы будем использовать модуль запросов, который вы можете получить с помощью запросов на установку pip3 в терминале вашего редактора кода (например, VSCode).
API, предоставляющие данные, бывают бесплатными и платными — в зависимости от простоты использования. Я нашел бесплатный источник ExchangeRateAPI и буду использовать его, потому что он не заставляет меня регистрироваться, пока я я просто тестирую здесь.
Данные API обычно поступают в виде JSON (очень похожего на словарь в python) для легкой интерпретации программистами, извлекающими эти данные. Вот код для получения текущей цены доллара США через 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
ключ.
Доступ к фактическому курсу конвертации в определенную валюту можно получить, используя трехбуквенный код валюты нужной валюты.
Например, чтобы получить курс конвертации в INR (индийская рупия), мне сначала нужно будет использовать ключ rates
, а затем ключ INR
в rates< ключ /код>.
:::предупреждение Чувствительность к регистру важна в большинстве API, поэтому нам также нужно предусмотреть это в нашем коде.
:::
Код для получения курса конвертации долларов США в индийские рупии, код на питоне будет выглядеть так -
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 ()
Ну вот, теперь стало немного лучше:
Конвертация 5000 индийских рупий в евро (успешный расчет конвертации):
"""
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
"""
Конвертация неподдерживаемой валюты (обработка ошибок):
"""
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
"""
Преобразование в неподдерживаемую валюту (обработка ошибок):
"""
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
"""
Некоторые заключительные примечания:
- Хотя мы использовали операторы печати здесь для наглядности, если вы создаете приложение, избегайте операторов печати и вместо них используйте return
* Некоторые API-интерфейсы премиум-класса (платные) предлагают лучшие источники, возможность принимать в качестве входных данных полное имя (индийская рупия) или только страну (США) и отвечать желаемым ответом
* Большинство API требуют использования ключей API для функций аутентификации и предотвращения DDoS. Подробнее о них читайте здесь.
* Атрибуты ресурсов: * RapidAPI * #API на HackerNoon
- Рекомендуемая литература:
- API с низким кодом
- Обработка ошибок в API React
- Использование API Google Таблиц в Python
- Защита ваших данных API
- GraphQL API
Оригинал