API для начинающих: запросы, ответы, ресурсы и GET объясняются с помощью кода

API для начинающих: запросы, ответы, ресурсы и GET объясняются с помощью кода

27 октября 2022 г.

Запрос и получение данных из интернет-источников — одна из основ программирования, но этому не учат в большинстве курсов «Изучение кода ». Для программистов-самоучек это один из навыков, который поможет вам продвинуться дальше по пути обучения и сделает вас лучше, чем 90 % других.

Что такое 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



Оригинал