Ось твій урок у стилі CS50. Приготуйся, зараз ми розберемо цю тему так, що ти захочеш задокументувати навіть свій список покупок!
🎓 УРОК: Документація API: OpenAPI та Swagger
1. 🔥 Вступ: Проблема «Чорної скриньки»
Уявіть ситуацію. Ви — талановитий шеф-кухар (бекенд-розробник). Ви на кухні, готуєте неймовірні страви. А в залі сидить клієнт (фронтенд-розробник або мобільний додаток), який хоче їсти.
Але є одна маленька проблема... У вас немає меню.
Клієнт кричить на кухню: "Дай мені їжу!" Ви питаєте: "Яку саме? Суп? Стейк? Десерт?" Клієнт: "Ну, щось смачне! І я маю 100 гривень!" Ви: "Але стейк коштує 200, а суп я віддаю тільки в обід!"
Це — хаос. Це — біль. Саме так виглядає розробка без документації. Фронтендер пише вам у Slack о другій ночі: "Слухай, а цей ендпоінт приймає userId як рядок чи як число?". Або ще гірше: ви змінили назву поля, нікому не сказали, і весь додаток "впав".
Риторичне питання: Хіба ми хочемо витрачати життя на пояснення того, як працює наш код, замість того, щоб писати новий? Звісно, ні!
Нам потрібен контракт. Нам потрібне Меню. Нам потрібна мова, якою бекенд і фронтенд домовляться раз і назавжди.
І тут на сцену виходять OpenAPI та Swagger.
2. 🧠 Теоретична база (Як це працює під капотом)
Давайте розберемося з термінами, бо їх часто плутають навіть сеньйори.
📜 OpenAPI vs Swagger: У чому різниця?
Уявіть це так: * OpenAPI — це граматика (правила). Це стандарт (специфікація), який каже: "Описуй свої API ось так, у форматі JSON або YAML". Це як правила української мови. * Swagger — це інструменти. Це як Microsoft Word або Google Docs для цієї мови. Swagger UI малює красиву веб-сторіночку, де можна тикати кнопочки, а Swagger Editor допомагає писати цей опис.
Запам’ятай: OpenAPI — це що ми пишемо (стандарт), Swagger — це чим ми користуємося (інструмент).
Як це виглядає "під капотом"?
Насправді, вся ваша документація — це просто один текстовий файл (зазвичай yaml або json). У ньому чітко прописано:
1. Шляхи (Paths): Куди стукати? (наприклад, /users)
2. Методи: Як стукати? (GET, POST, DELETE)
3. Параметри: Що передавати? (ID в URL, JSON в тілі запиту)
4. Відповіді (Responses): Що ми отримаємо? (Дані, помилку 404, успіх 200)
Вам не треба писати PDF-файли. Ви пишете код (структуру), який автоматично перетворюється на красиву інтерактивну інструкцію.
3. 🧪 Приклади (Від простого до реального)
Ми будемо використовувати формат YAML, бо його легше читати людині, ніж JSON (менше дужок, більше відступів).
Приклад 1: "Привіт, світ!"
Уявіть найпростіший сервер, який просто перевіряє, чи ми живі. Питання до тебе: Що нам треба знати, щоб зробити запит? Правильно: URL та метод.
openapi: 3.0.0
info:
title: Ping API
version: 1.0.0
paths:
/ping:
get:
summary: Перевірка зв'язку
responses:
'200':
description: Все працює! Сервер відповідає "Pong"
Що ми бачимо: Є шлях /ping. Якщо зробити GET-запит, отримаємо статус 200 (ОК). Все просто.
Приклад 2: Замовлення кави (Реальна ситуація)
Тепер складніше. Ми хочемо замовити каву.
Питання: Якщо ми щось замовляємо (створюємо), який HTTP метод ми використаємо? І що нам треба передати бариста?
Відповідь: Метод POST. Треба передати назву кави і розмір.
Давайте опишемо це мовою OpenAPI:
paths:
/order:
post:
summary: Замовити каву
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
coffee_type:
type: string
example: "Latte"
size:
type: string
enum: [small, medium, large] # Обмеження вибору!
responses:
'201':
description: Замовлення прийнято
content:
application/json:
schema:
type: object
properties:
order_id:
type: integer
message:
type: string
Чому це круто?
Подивіться на рядок enum: [small, medium, large]. Swagger UI автоматично намалює випадаючий список! Фронтендер фізично не зможе відправити вам розмір "huge", бо документація це забороняє. Ми вирішили проблему ще до написання коду!
4. 🛠 Практична частина
Час закачати рукави. Уявіть, що ви редагуєте цей YAML файл.
Завдання 1: Знайди помилку У прикладі нижче розробник забув вказати тип даних для віку користувача. Як би ти це виправив?
properties:
username:
type: string
age:
# Тут чогось не вистачає...
Завдання 2: "Суворий контроль"
Додай до поля password обмеження, щоб мінімальна довжина була 8 символів. (Підказка: в OpenAPI є властивість minLength).
Завдання 3: Новий статус
У прикладі з кавою ми додали відповідь 201 (Created). Але що, якщо кавомашина зламалася? Додай відповідь зі статусом 500 і описом "Внутрішня помилка кавомашини".
Завдання 4: Міні-кейс
Напиши фрагмент специфікації для шляху /users/{id}.
* Метод: GET
* Він має приймати id (ціле число) прямо в шляху (path parameter).
* Якщо користувача знайдено — повертає 200.
* Якщо ні — повертає 404.
Завдання 5: А що, якщо...
Що, якщо ми змінимо назву поля з coffee_type на product_name у документації, але забудемо змінити в коді бекенда? Що станеться, коли фронтенд спробує зробити запит? (Подумай про наслідки розсинхронізації).
5. 💡 Мислення як у розробника
Ось що відрізняє новачка від профі в роботі з документацією.
1. Code-First vs Design-First * Новачок: Спочатку пише код (Python/Java/JS), а потім, коли все готово, сяк-так генерує документацію. Це часто призводить до застарілих доків. * Профі: Часто використовує Design-First. Спочатку ми пишемо YAML файл (OpenAPI). Ми сперечаємося про назви полів до того, як написали хоч рядок коду. Як тільки затвердили файл — бекендер йде писати API, а фронтендер — верстати інтерфейс. Паралельна робота!
2. Документація — це "Єдине Джерело Правди" (Single Source of Truth) Якщо в коді написано одне, а в Swagger — інше, це баг. Документація, яка бреше, гірша за відсутність документації.
3. Не пиши вручну, якщо можеш згенерувати У більшості сучасних фреймворків (FastAPI, NestJS, Spring Boot) ти пишеш код, додаєш пару декораторів/анотацій, і Swagger генерується сам. Це магія, яку треба використовувати.
6. 🧩 Підсумок
Отже, що ми маємо в сухому залишку:
- Ми не хочемо хаосу, тому використовуємо контракти.
- OpenAPI — це стандарт (наш закон).
- Swagger — це візуалізатор (наш красивий інтерфейс для закону).
- Це економить години суперечок і мільйони нервових клітин.
Що ти тепер вмієш? Ти можеш відкрити будь-яку документацію API (Stripe, Google Maps, Twitter) і не злякатися. Ти розумієш, де шукати методи, параметри і що очікувати у відповідь. Ти став "писемним" у світі API.
🚀 Тизер наступного уроку: Добре, ми описали, як виглядає запит. Але як переконатися, що користувач має право робити цей запит? На наступному уроці ми поговоримо про фейс-контроль у світі вебу: Автентифікація, JWT токени та безпека API.
До зустрічі! Це був CS50... тобто, твій персональний урок!