Как тестируют API: разбираемся на примере REST API
easy

Как тестируют API: разбираемся на примере REST API

Как убедиться, что API работает правильно

Чтобы разные программы могли общаться друг с другом, используют API — специальные наборы правил и инструментов. Представим, что одна программа пришла в кафе. Чтобы сделать заказ, программа выбирает какие-то позиции в меню и перечисляет их официанту. Официант — это API, который принимает заказ, передаёт его на кухню, то есть другой программе-повару, а затем приносит первой программе то, что она заказала.

Получается, что API — что-то вроде универсального переводчика, который помогает программам обмениваться данными и функциями. Достаточно добавить в код несколько функций с нужными запросами, и тогда, например, приложение погоды на смартфоне будет запрашивать данные у сервера метеорологических данных, а затем показывать пользователю соответствующий прогноз.

Бывает, что нужно убедиться, что API работает как надо и передаёт то, что нужно. Чтобы не проверять всё на настоящей программе, делают проще и тестируют API с помощью отдельных инструментов. Рассказываем о некоторых из них.

curl

curl.se/download.html

Curl (расшифровывается как Client URL Request Library) — инструмент командной строки для передачи данных. Проверить установку можно командой curl --version. Если всё установлено правильно, вы увидите краткую информацию о версии программы:

curl

Иногда в документации к API приведены шаблоны запросов через curl, но если их нет, можно использовать реальные GET-запросы. Для этого перед запросом в командной строке нужно написать curl. Например, мы хотим получить случайное аниме из базы данных MyAnimeList, у которой есть Jikan API. Если бы это случайное аниме запрашивала программа, она бы использовала команду GET "https://api.jikan.moe/v4/random/anime". В нашем случае проверки с помощью curl эта команда будет выглядеть так:

curl https://api.jikan.moe/v4/random/anime

Как тестируют API: разбираемся на примере REST API

Отправляем запрос и смотрим на ответ. Разобрать его сложно:

Как тестируют API: разбираемся на примере REST API

Чтобы содержание можно было понять, нам понадобится ещё одна утилита для командной строки — jq. Установить нужную версию для своей системы можно на официальном сайте.

После установки нужно добавить в конце запроса | jq:

curl https://api.jikan.moe/v4/random/anime | jq

Теперь ответ разобрать гораздо проще:

Как тестируют API: разбираемся на примере REST API

Некоторые сервисы специально адаптированы для работы с curl. Например, попробуйте отправить запрос curl wttr.in и посмотреть на результат.

Postman

postman.com/downloads/

Postman — одна из самых популярных утилит для тестирования API. Можно скачать десктопную версию, пользоваться веб-приложением или установить плагин для среды разработки Visual Studio Code. У Postman есть платная версия, но для большинства задач тестирования достаточно бесплатной. 

Чтобы начать пользоваться веб-приложением, нужно создать аккаунт на postman.com. Плагин для VS Code находим в разделе расширений:

Postman

Для работы с Postman понадобится создать проект. Для этого переходим на вкладку Workspaces:

Postman

И добавляем новый нажатием на кнопку Create Workspace:

Postman

В некоторых API-документациях есть опция — запустить сразу в Postman. Например, такая кнопка есть у SpaceX API:

Postman

После перехода на другую страницу сервис спросит, в какой версии мы хотим работать с API:

Postman

При переходе из документации API на одну из версий Postman попросит выбрать, в какой из существующих проектов импортировать API, который мы хотим протестировать. В онлайн-версии это будет выглядеть так:

Postman

Теперь в панели слева у нас разделены по папкам все варианты запросов, которые можно отправить в SpaceX: информация про капсулы, запуски, технику, экипаж. Не знаем, насколько эти данные соответствуют реальности, но звучит круто:

Как тестируют API: разбираемся на примере REST API

Когда мы выбираем один из вариантов запроса, он автоматически подставляется в рабочее окно. Например, если выберем папку Rockets → запрос Get all Rockets и нажмём синюю кнопку Send, то получим JSON на 460 строк с информацией о ракетах:

Как тестируют API: разбираемся на примере REST API

Python

Python — или любой другой язык программирования — ещё один вариант протестировать работу API. Если вы пишете своё приложение и хотите добавить программный интерфейс для работы с другим сервисом, этот способ удобнее всего.

Для отправки запросов в Python нужно добавить библиотеку с нужными функциями. Таких библиотек несколько, мы добавим requests. Сначала устанавливаем её командой pip install requests.

Это можно сделать в терминале:

Python

…или прямо в IDE, в котором работаете:

Python

Попробуем отправить запрос на Numbers API, используя шаблон кода из документации RapidAPI.

Сначала импортируем библиотеку:

# импортируем библиотеку в проект
import requests

Теперь возьмём URL-адрес из запроса для получения факта из математики и сохраним его в переменную:

# объявляем переменную с адресом, на который нужно послать запрос
url = "https://numbersapi.p.rapidapi.com/1729/math"

По инструкции RapidAPI нам нужно добавить в запрос дополнительные параметры-заголовки. Один из них — это ваш личный токен, API-ключ. Посмотреть его можно здесь:

Python

Мы для примера вставляем ненастоящий токен, поэтому, чтобы запрос сработал, в код ниже нужно будет вставить свой напротив ключа "x-rapidapi-key".

# добавляем в запрос заголовки — личный API-ключ и хост, который принимает запросы
headers = {
    "x-rapidapi-key": "cbas234jl2lkj23lj324lj3lj34j23ljs09sdf234jksdf0dsfs90fs70",
    "x-rapidapi-host": "numbersapi.p.rapidapi.com"
}

После этого можно делать запрос. Чтобы сохранить данные, объявляем ещё одну переменную и добавляем в запрос URL-адрес и заголовки:

# объявляем переменную, в которую сохраним результат
# GET-запроса по заданному URL и нужные заголовки
response = requests.get(url, headers=headers)

Чтобы увидеть результат, выведем запрос на экран в текстовом формате. Перед этим добавим проверку на статус-код ответа от сервера. Если код равен 200, можно выводить текст ответа. Если сервер вернул другой код, выведем код ошибки:

# если от сервера пришёл статус-код успешного запроса,
# выводим на экран ответ в формате текста
if response.status_code == 200:
   print(response.text)
# если от сервера пришёл статус-код ошибки запроса,
# выводим на экран этот статус-код
else:
   print(f"Запрос не удался. Код ошибки: {response.status_code}")

Если запустить этот код целиком с нашим настоящим API-ключом, придёт такой ответ:

1729 is the smallest natural number representable in two different ways as a sum of two positive cubes, as Ramanujan stated on the spot.

Теперь попробуем подставить вместо 1729 неподходящий формат — напишем abcd:

# объявляем переменную с адресом, на который нужно послать запрос
url = "https://numbersapi.p.rapidapi.com/abcd/math"

Получим ошибку, потому что тип значений в этом поле должен быть целым числом. В нашем сообщении об ошибке мы этого не увидим, потому что проверяем статус-код сервера. Нам придёт такое:

Запрос не удался. Код ошибки: 404

Как вывести отдельное значение из ответа

Иногда ответ приходит в виде огромного JSON-значения или списка, а нам нужно только что-то одно из всего этого массива. Для этого можно воспользоваться индексами и ключами.

Ответ от SpaceX API на запрос обо всех запусках приходит в виде списка. Мы достанем оттуда три конкретных факта: название запуска, дату и детали.

Сначала импортируем библиотеку и укажем адрес для запроса:

# импортируем библиотеку в проект
import requests
# создаём запрос по указанному в документации адресу
response = requests.get("https://api.spacexdata.com/v4/launches")

Чтобы можно было извлекать данные по ключам, переводим ответ в формат JSON:

# переводим ответ в формат json
data = response.json()

Теперь выделяем набор ключей по конкретному виду запуска. Мы в примере возьмём первый:

# выделяем информацию о первом запуске
latest_launch = data[1]

Теперь берём эту информацию и сохраняем в каждую переменную значения по нужным ключам — launch_name, launch_date, launch_details. После этого выводим значения на экран:

# получаем значения по ключам: имя, дата запуска, детали
launch_name = latest_launch['name']
launch_date = latest_launch['date_utc']
launch_details = latest_launch['details']
# выводим каждое полученное значение отдельно
print('launch_name: ', launch_name)
print('launch_date: ', launch_date)
print('launch_details: ', launch_details)

Запускаем:

launch_name:  DemoSat

launch_date:  2007-03-21T01:10:00.000Z

launch_details:  Successful first stage burn and transition to second stage, maximum altitude 289 km, Premature engine shutdown at T+7 min 30 s, Failed to reach orbit, Failed to recover first stage

Что в следующий раз

Теперь, когда мы знаем, как устроены самые популярные REST API, в следующий раз возьмём один из фреймворков для написания API и напишем свой. А вы пока подпишитесь, чтобы не пропустить продолжение и тоже написать что-то своё.

Редактор:

Инна Долога

Обложка:

Алексей Сухов

Корректор:

Ирина Михеева

Вёрстка:

Маша Климентьева

Соцсети:

Юлия Зубарева

Получите ИТ-профессию
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию
Еще по теме
easy