Делаем запросы к API с помощью Python
API (Application Programming Interface – интерфейс прикладного программирования) – это сервер, который позволяет извлекать и отправлять данные с помощью кода. В основном мы используем API для получения данных. Именно эта тема и будет в фокусе нашего руководства для начинающих. Итак, приступим!
Когда мы хотим получать данные из API, нам нужно сделать запрос. Запросы используются по всему Интернету. Например, когда вы зашли на этот сайт, ваш браузер сделал запрос на веб-сервер Pythonist, который ответил и выдал вам содержание данной веб-страницы.
Запросы API работают точно так же. Вы запрашиваете данные у сервера API, и он отвечает на ваш запрос. Сервер может вам вернуть какие-то данные или код, который будет в дальнейшем интерпретирован вашей машиной.
Например, когда возвращается HTML-код страницы, для пользователя она преображается именно в страницу с различными надписями, картинками и т.д., а не остается просто в виде кода. Конечно, всегда может что-то пойти не по плану ?, но в остальных случаях это должно работать именно так.
Различные методы HTTP и коды ответов
Для REST API есть различные HTTP-методы. Они сообщают API, какие операции необходимо выполнить с данными. Хотя HTTP-методов довольно много, с REST API чаще всего используются следующие пять:
HTTP-метод | Описание |
---|---|
GET | Получить существующие данные |
POST | Добавить новые данные |
PUT | Обновить существующие данные |
PATCH | Частично обновить существующие данные |
DELETE | Удалить данные |
Как только REST API получает и обрабатывает HTTP-запрос, он возвращает ответ с кодом состояния HTTP. Этот код состояния предоставляет информацию об ответе и помогает клиентскому приложению узнать, что это за ответ.
Коды ответов или коды состояния нумеруются в зависимости от категории результата:
Код | Категория результата |
---|---|
1хх | Информационный ответ |
2хх | Успешная операция |
3хх | Перенаправление |
4хх | Ошибка на стороне клиента |
5хх | Ошибка на стороне сервера |
Вы можете узнать больше о кодах состояния HTTP в веб-документации MDN.
Конечные точки API
Конечные точки API – это общедоступные URL-адреса, предоставляемые сервером, которые клиентское приложение использует для доступа к различным ресурсам и данным.
В этом руководстве мы будем использовать REST API Fake Store. В частности, мы воспользуемся следующими конечными точками:
HTTP-мето | Конечная точка API | Описание |
---|---|---|
GET | /products | Получить список продуктов |
GET | /products?limit=x | Получить только х товаров (к примеру, только 5 товаров) |
GET | /products/ | Получить один конкретный продукт |
POST | /products | Создать новый продукт |
PUT | /products/ | Обновить товар |
PATCH | /products/ | Частично обновить товар |
DELETE | /products/ | Удалить товар |
Каждая из вышеперечисленных конечных точек выполняет разные действия в зависимости от метода HTTP. Для каждого URL-адреса API базовый URL-адрес это: https://fakestoreapi.com. Мы будем исследовать запросы по очереди.
Однако сначала нам нужно установить внешнюю библиотеку для использования этих API. Большинство разработчиков Python для взаимодействия с веб-сервисами используют библиотеку запросов requests. Вы можете установить эту библиотеку с помощью команды pip следующим образом:
Как только библиотека установлена, все готово и можно приступать!
Как сделать запрос GET
Это один из наиболее распространенных методов HTTP-запросов, с которыми вы столкнетесь. Это операция только для чтения, позволяющая получать данные из API.
Давайте попробуем использовать запрос GET на первой конечной точке из упомянутых выше. Она должна вернуть список продуктов.
import requests BASE_URL = 'https://fakestoreapi.com' response = requests.get(f"/products") print(response.json())
В приведенном выше сценарии используется метод requests.get() для отправки запроса GET в конечную точку API /products. Данный запрос возвращает нам список всех продуктов. Затем мы вызываем метод .json() , чтобы просмотреть полученный ответ JSON. Выглядит он так:
Если вы присмотритесь, ответ в виде JSON выглядит как список словарей в Python. JSON – это очень популярный формат обмена данными для REST API.
Вы также можете получить и другие атрибуты, связанные с ответом, например код состояния. Это будет выглядеть следующим образом:
print(response.status_code) # OUTPUT >>> 200
Как известно, код состояния 200 означает, что нам пришел успешный ответ и всё сработало отлично.
Поскольку конечная точка /products возвращает много данных, давайте ограничим эти данные только тремя продуктами.
Для этого у нас есть конечная точка /products?limit=x, где x – это положительное целое число. limit (лимит, ограничение) — параметр запроса. Давайте посмотрим, как мы можем добавить этот параметр в наш запрос:
import requests BASE_URL = 'https://fakestoreapi.com' query_params = < "limit": 3 >response = requests.get(f"/products", params=query_params) print(response.json())
Метод requests.get() принимает параметр с именем params , в котором мы можем указать параметры нашего запроса в формате словаря Python. Таким образом, мы создаем словарь с именем query_params и передаем limit в качестве ключа и 3 в качестве значения. Затем мы передаем этот словарь query_params в request.get() . Теперь наш код выглядит следующим образом:
Таким образом, у нас есть данные об ответах, ограниченные всего тремя продуктами. Попробуем получить только один товар, id которого равен 18.
import requests BASE_URL = 'https://fakestoreapi.com' response = requests.get(f"/products/18") print(response)
Поскольку у нас есть конечная точка /products/, мы можем передать идентификатор 18 в URL-адресе API и сделать для него запрос GET. Ответ будет выглядеть следующим образом:
Как сделать POST-запрос
Мы используем запрос POST для добавления новых данных в REST API. Данные отправляются на сервер в формате JSON, который выглядит как словарь Python. Согласно документации Fake Store API, у продукта есть следующие атрибуты: title (название), price (цена), description (описание), image (изображение) и category (категория). Итак, наша новинка выглядит так:
Мы можем отправить запрос POST с помощью метода requests.post() следующим образом:
import requests BASE_URL = 'https://fakestoreapi.com' new_product = < "title": 'test product', "price": 13.5, "description": 'lorem ipsum set', "image": 'https://i.pravatar.cc', "category": 'electronic' >response = requests.post(f"/products", json=new_product) print(response.json())
В методе request.post() мы можем передавать данные JSON с помощью аргумента json . Использование аргумента json автоматически устанавливает в Content-Type значение Application/JSON в заголовке запроса.
Как только мы сделаем запрос POST в конечной точке /products, мы получим объект продукта с идентификатором в ответе. Этот ответ выглядит так:
Если мы не используем аргумент json , мы должны сделать запрос POST следующим образом:
import requests import json BASE_URL = 'https://fakestoreapi.com' new_product = < "title": 'test product', "price": 13.5, "description": 'lorem ipsum set', "image": 'https://i.pravatar.cc', "category": 'electronic' >headers = < "Content-Type": "application/json" >response = requests.post(f"/products", data=json.dumps(new_product), headers=headers) print(response.json())
В этом случае, когда мы используем аргумент data вместо json , нам нужно явно установить Content-Type на application/json в заголовке. Когда мы используем аргумент json , нам не нужно сериализовать данные, но в данном случае это необходимо и делается с помощью json.dumps() .
Как сделать запрос PUT
Нам часто требуется обновить существующие данные в API. Используя запрос PUT, мы можем обновить данные полностью. Это означает, что, когда мы делаем запрос PUT, он заменяет все старые данные новыми.
В запросе POST мы создали новый продукт с идентификатором 21. Давайте обновим старый продукт на новый, сделав запрос PUT к конечной точке products/. Напишем следующий код:
import requests BASE_URL = 'https://fakestoreapi.com' updated_product = < "title": 'updated_product', "category": 'clothing' >response = requests.put(f"/products/21", json=updated_product) print(response.json())
Когда мы делаем запрос PUT с updated_product с помощью метода requests.put() , он возвращает нам следующие данные JSON:
Обратите внимание, что старый продукт был полностью заменен обновленным продуктом.
Как сделать PATCH-запрос
Иногда нам не нужно полностью заменять старые данные. Скорее мы хотим изменить только определенные поля. В этом случае мы используем запрос PATCH.
Давайте обновим категорию ( category ) продукта обратно с clothing (одежды) на electronic (электронику), сделав запрос PATCH к конечной точке products/. Наш код будет выглядеть так:
import requests BASE_URL = 'https://fakestoreapi.com' updated_product = < "category": 'electronic' >response = requests.patch(f"/products/21", json=updated_product) print(response.json())
В этом случае мы используем метод requests.patch() , который возвращает такой ответ:
Обратите внимание, что на этот раз все данные не изменились – обновилось только поле category (категория).
Как сделать запрос DELETE
Как следует из названия, если вы хотите удалить ресурс из API, вы можете использовать запрос DELETE. Удалим товар с идентификатором, равным 21:
import requests BASE_URL = 'https://fakestoreapi.com' response = requests.delete(f"/products/21") print(response.json())
Метод requests.delete() помогает нам сделать запрос DELETE к конечной точке /products/.
Заключение
В этом руководстве мы рассмотрели, как взаимодействовать с веб-сервисами с помощью Python. Мы рассказали о пяти разных запросах: GET, POST, PUT, PATCH и DELETE. Более того, мы разобрали на примерах их синтаксис и принцип работы. Также мы обсудили, какие есть коды ответов или коды состояния и что они значат.
Надеемся, вам понравилось данное руководство – спасибо, что прочитали! Успехов в написании кода!