Python · API · Начальный уровень

Первый запрос

5 задач

Сделайте первый HTTP-запрос с помощью библиотеки requests и прочитайте ответ.

HTTP-запросы с библиотекой requests

#
В этом разделе мы будем практиковатся на специальном сайте созданным мной для этого. Этот сайт представляет собой фейковый интернет-магазин, который полностью работает как настоящий. У него есть и обычный пользоваетльсктй интерфейс в браузере и полное покрытие всех возможностей через RESTful API. Ниже я предоставлю сразу несколько ссылок, чтоб вы могли перейти на этот сайт и ознакомиться с ним перед материалами и упражнениями этого раздела: Главная страница сайта с информацией о нем: [https://apilearn.tukas.dev/](https://apilearn.tukas.dev/) Специально сделанная подробная документация по его API (не переживайте, вы сейчас начнете ее понимать): [https://apilearn.tukas.dev/api/docs/](https://apilearn.tukas.dev/api/docs/) Хорошо, после беглого знакомства с сайтом, давайте приступим к изучению работы с API. Веб строится на простом обмене: клиент отправляет запрос, сервер отправляет ответ. Когда вы вводите URL в браузере, браузер является клиентом. С библиотекой requests ваш Python-скрипт становится клиентом. Установите один раз: ```bash pip install requests ``` Чтобы получить данные, используйте requests.get() с URL: ```python import requests response = requests.get('https://apilearn.tukas.dev/api/products/') print(response.status_code) # 200 ``` Возвращаемое значение — объект Response. Он содержит всё, что отправил сервер: код статуса, заголовки ответа и тело. Коды статуса — трёхзначные числа, которые говорят, что произошло: - 2xx — успех. 200 означает OK, 201 — ресурс создан. - 4xx — ошибка клиента. Вы сделали плохой запрос (400), забыли авторизацию (401) или запросили что-то, что не существует (404). - 5xx — ошибка сервера. Сервер упал или перегружен. Атрибут .ok даёт быструю булеву проверку — True для любого статуса 2xx, False для всего остального: ```python if response.ok: print('получен валидный ответ') else: print(f'запрос завершился ошибкой со статусом {response.status_code}') ``` Распространённая ошибка — вызывать .json() без проверки .ok. Если сервер возвращает 404, .json() либо выбросит исключение, либо вернёт пейлоад с ошибкой — не те данные, которые вы ожидали. Всегда проверяйте перед чтением.

Чтение ответа

#
Когда вы убедились, что ответ успешен, прочитайте тело с помощью .json(). Метод разбирает JSON-строку и возвращает dict или list Python: ```python import requests response = requests.get('https://apilearn.tukas.dev/api/products/') data = response.json() print(data['count']) # 372 — всего продуктов в базе print(data['next']) # URL следующей страницы print(len(data['results'])) # элементов на этой странице (20 по умолчанию) ``` Каждый элемент в results — это dict. Доступ к полям через стандартную нотацию с ключом: ```python first = data['results'][0] print(first['name']) # 'Tea Table Set with Three Chairs' print(first['price']) # '150.00' print(first['sell_price']) # '135.00' print(first['category']['name']) # 'Kitchen' ``` Цены возвращаются как строки ('150.00'), а не числа с плавающей точкой. Это обычно для API — арифметика с float может вносить мелкие погрешности при работе с деньгами. Конвертируйте через float() или Decimal, если нужны вычисления. Заголовки ответа доступны через .headers, который работает как нечувствительный к регистру dict: ```python print(response.headers['Content-Type']) # application/json print(response.headers.get('X-Request-Id')) # None, если заголовок отсутствует ``` Используйте .get() вместо прямого обращения по ключу, когда заголовок может отсутствовать — иначе получите KeyError.

Справочник объекта ответа

#
Атрибуты объекта Response: ``` .status_code integer HTTP-код статуса (200, 404, 500, ...) .ok bool True, если status_code < 400 .json() dict/list Разбор тела ответа как JSON .text str Тело ответа как декодированная строка .content bytes Тело ответа как сырые байты .headers dict-like Заголовки ответа (ключи нечувствительны к регистру) .url str Финальный URL после всех перенаправлений ``` Безопасный паттерн чтения JSON: ```python response = requests.get(url) if response.ok: data = response.json() else: print(f'Ошибка {response.status_code}: {response.text}') ``` Распространённые коды статуса: ``` 200 OK Запрос выполнен, тело содержит данные 201 Created Ресурс создан (после POST) 400 Bad Request Ваш запрос содержит невалидные параметры 401 Unauthorized Требуется аутентификация 403 Forbidden Аутентифицирован, но доступ запрещён 404 Not Found Ресурс не существует 500 Internal Server Error Ошибка на стороне сервера ```
01

Первый запрос

#

Отправьте GET-запрос к https://apilearn.tukas.dev/api/products/ и выведите код статуса.

import requests

BASE_URL = 'https://apilearn.tukas.dev'

# Ваш код здесь
Решение
import requests

BASE_URL = 'https://apilearn.tukas.dev'

response = requests.get(f'{BASE_URL}/api/products/')
print(response.status_code)
02

Подсчёт продуктов

#

Выполните GET /api/products/ и выведите общее количество продуктов в базе данных. Количество находится в JSON-ответе, а не в длине списка results на этой странице.

import requests

BASE_URL = 'https://apilearn.tukas.dev'

response = requests.get(f'{BASE_URL}/api/products/')
data = response.json()

# Выведите общее количество продуктов
Решение
import requests

BASE_URL = 'https://apilearn.tukas.dev'

response = requests.get(f'{BASE_URL}/api/products/')
data = response.json()

print(data['count'])
03

Чтение первого продукта

#

Получите список продуктов и выведите name и sell_price первого продукта в results.

import requests

BASE_URL = 'https://apilearn.tukas.dev'

response = requests.get(f'{BASE_URL}/api/products/')
data = response.json()

# Выведите name и sell_price первого продукта
Решение
import requests

BASE_URL = 'https://apilearn.tukas.dev'

response = requests.get(f'{BASE_URL}/api/products/')
data = response.json()

first = data['results'][0]
print(first['name'])
print(first['sell_price'])
04

Проверка успешности

#

Выполните GET-запрос к https://apilearn.tukas.dev/api/products/. Используйте response.ok, чтобы вывести 'Успех', если запрос удался, или 'Ошибка: {status_code}', если нет.

import requests

BASE_URL = 'https://apilearn.tukas.dev'

response = requests.get(f'{BASE_URL}/api/products/')

# Проверьте response.ok и выведите соответствующее сообщение
Решение
import requests

BASE_URL = 'https://apilearn.tukas.dev'

response = requests.get(f'{BASE_URL}/api/products/')

if response.ok:
    print('Успех')
else:
    print(f'Ошибка: {response.status_code}')
05

Чтение заголовка ответа

#

Получите список продуктов и выведите значение заголовка Content-Type в ответе.

import requests

BASE_URL = 'https://apilearn.tukas.dev'

response = requests.get(f'{BASE_URL}/api/products/')

# Выведите заголовок Content-Type
Решение
import requests

BASE_URL = 'https://apilearn.tukas.dev'

response = requests.get(f'{BASE_URL}/api/products/')

print(response.headers['Content-Type'])