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'])