У цьому розділі ми будемо практикуватися на спеціальному сайті, створеному мною для цього.
Цей сайт є фейковим інтернет-магазином, який повністю працює як справжній. У нього є і звичайний користувальницький інтерфейс у браузері і повне покриття всіх можливостей через 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 Помилка на стороні сервера
```
Зробіть GET /api/products/ та виведіть загальну кількість продуктів у базі даних. Кількість знаходиться в JSON-відповіді, а не в довжині списку results на цій сторінці.
import requests
BASE_URL = 'https://apilearn.tukas.dev'
response = requests.get(f'{BASE_URL}/api/products/')
data = response.json()
# Виведіть загальну кількість продуктів
Отримайте список продуктів та виведіть 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'])
Зробіть 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 і виведіть відповідне повідомлення
Ми використовуємо необхідні cookies для роботи сайту. З вашого дозволу ми також можемо зберігати налаштування сайту та використовувати аналітичні й рекламні cookies, щоб розуміти використання сайту й підтримувати розвиток проєкту.
* Ви завжди можете змінити свій вибір у налаштуваннях сайту.
Оберіть категорії cookies
Налаштування аналітики
Можна вимкнути аналітику використання платформи. Також можна надіслати в Google Analytics запит на видалення даних про використання цього сайту, пов'язаних із цим браузером.
Навчальний workspace
Навчайтеся, читаючи, запускаючи код і розв'язуючи задачі.
Практикуйте програмування з поясненнями тем, вправами, інструментами browser IDE, перевіркою regex і тренуванням друку коду в одному workspace.
Відкривайте інструменти у вкладках.Вправи, IDE-інструменти й тренажери залишаються доступними як вкладки сайту.
Перемикайтеся без втрати контексту.Переходьте між поясненнями, кодом та утилітами, зберігаючи своє місце.
Використовуйте sidebar як карту.Ліві панелі містять навігацію, налаштування, файли, libraries та керування інструментами.
PythonJavaScriptSQLite
Одна IDE, три практичні режими
Python у браузері.Запускайте невеликі скрипти, пробуйте бібліотеки й тренуйте API-запити без встановлення.
JavaScript для швидких експериментів.Перевіряйте код для браузера й порівнюйте ідеї поруч із навчальними матеріалами.
SQLite для практики з даними.Відкривайте оглядач бази даних, переглядайте таблиці, пишіть запити й вивчайте SQL локально.
ТемаIDE
Працюйте поруч у split tabs
Тримайте інструкції перед очима.Відкрийте вправу або довідкову сторінку поруч з IDE, замість постійних перемикань.
Порівнюйте інструменти під час навчання.Розміщуйте перевірки regex, пояснення та експерименти з кодом поруч, коли це потрібно для задачі.
Закрийте split, коли завершите.Workspace повернеться до однієї сфокусованої вкладки, а відкриті вкладки сайту залишаться доступними.
Тренажер друку коду
Або звичайного тексту
Тренажер розрахований на фізичну клавіатуру.Відкрийте цей розділ на ноутбуці або комп'ютері з широким екраном. На телефоні тренування друку не працюватиме коректно.
Швидкість: 0 зн/хв
0 слів/хв
Найкраща швидкість (60с): 0 зн/хв
0 слів/хв
Помилки: 0
Загальний час: 0.0 с
Щоб тренувати сліпий друк, не підглядайте на фізичну клавіатуру.