Ось готовий урок, створений у стилі Девіда Малана (CS50) — енергійний, зрозумілий та орієнтований на практику.
🎓 Урок: Path Operations і HTTP-методи
(Або: Як змусити сервер вас слухатись)
1. 🔥 Вступ: проблема та мотивація
Привіт усім! Радий вас бачити.
Уявіть, що ви прийшли до ресторану. Ви сідаєте за столик, до вас підходить офіціант, і ви мовчки тицяєте пальцем у рядок меню, де написано "Борщ".
Офіціант дивиться на вас і не розуміє. Чому? Бо ви вказали "що" (Борщ), але не сказали "що з ним зробити". * Ви хочете замовити борщ? * Ви хочете дізнатися склад борщу? * Чи, може, ви хочете повернути борщ на кухню, бо він холодний?
В інтернеті — та сама історія.
Коли ви вводите адресу сайту (наприклад, google.com), ви вказуєте серверу "адресу" (Path). Але серверу цього замало! Йому треба знати, яка саме дія (Operation) вам потрібна.
Без цього ми б не мали ані Instagram, ані Telegram, ані онлайн-банкінгу. Ми б мали лише статичні сторінки, на які можна тільки дивитись, але нічого не можна змінити. Нудно, правда?
Сьогодні ми навчимося говорити із сервером повноцінними реченнями. Ми розберемо Path Operations та HTTP-методи.
2. 🧠 Теоретична база (без нудьги)
Давайте заглянемо під капот. Коли ваш браузер (або код) звертається до сервера, він завжди надсилає дві головні речі:
- URL (Path / Шлях): Це адреса ресурсу. Наприклад,
/usersабо/items/5. Це наш "Борщ" у меню. - Method (Метод): Це дієслово. Це те, що ми хочемо зробити з цим ресурсом.
"Священна четвірка" методів (CRUD)
У світі вебу є чотири головні дії, які покривають 99% задач. Запам'ятайте абревіатуру CRUD (Create, Read, Update, Delete). Кожній літері відповідає свій HTTP-метод:
-
GET (Read) 👉 Отримати дані.
- Аналогія: Ви читаєте меню. Ви нічого не змінюєте на кухні, просто отримуєте інформацію.
- Приклад: Відкрити стрічку новин.
-
POST (Create) 👉 Створити щось нове.
- Аналогія: Ви робите замовлення. На кухні починається робота, з'являється нова страва.
- Приклад: Опублікувати фото в Instagram, зареєструватися.
-
PUT (Update) 👉 Оновити/Замінити.
- Аналогія: Ви передумали й кажете: "Замість супу дайте мені салат".
- Приклад: Змінити ім'я у профілі.
-
DELETE (Delete) 👉 Видалити.
- Аналогія: "Скасуйте замовлення!"
- Приклад: Видалити невдалий коментар.
❗️ Що таке "Path Operation"? Це термін (часто використовується у фреймворках типу FastAPI), який поєднує ці дві речі. Path (Шлях) + Operation (Метод) = Функція у вашому коді, яка виконається.
3. 🧪 Приклади (від простого до реального)
Будемо використовувати Python (схожий на синтаксис FastAPI), бо він читається як англійська мова.
Приклад 1: Звичайний GET
Уявіть, що у нас є застосунок для бібліотеки.
@app.get("/books")
def read_books():
return {"message": "Ось список усіх книг"}
- Питання до вас: Що станеться, якщо я введу
/booksу браузері? - Відповідь: Браузер за замовчуванням завжди використовує метод GET. Сервер побачить шлях
/books, побачить методGETі запустить функціюread_books. Ви побачите список.
Приклад 2: Додавання книги (POST)
А тепер ми хочемо додати книгу.
@app.post("/books")
def create_book(title: str):
return {"message": f"Книгу '{title}' успішно додано!"}
- Що тут цікавого? Шлях той самий —
/books! - Але: Метод змінився на
@app.post. - Логіка: Сервер досить розумний, щоб розрізнити ці запити.
- Прийшов
GETна/books? 👉 Показати список. - Прийшов
POSTна/books? 👉 Створити нову книгу.
- Прийшов
Приклад 3: Конкретна дія (DELETE)
Видаляємо книгу за її ID.
@app.delete("/books/{book_id}")
def delete_book(book_id: int):
return {"message": f"Книгу з ID {book_id} знищено!"}
- Ситуація: Ви відправляєте запит
DELETEна адресу/books/42. - Результат: Сервер шукає функцію, яка відповідає за
DELETEі має динамічний параметр. Функція спрацьовує, і книга з ID 42 зникає.
4. 🛠 Практична частина
Час "забруднити руки" кодом. Уявіть, що ви пишете API для Інтернет-магазину кросівок.
Завдання 1 (GET):
Напишіть Path Operation, яка показує опис конкретної пари кросівок, якщо користувач переходить за посиланням /sneakers/nike-air.
Завдання 2 (POST):
Користувач натискає кнопку "Купити". Напишіть операцію для шляху /cart (кошик), яка додає товар. Який метод ви використаєте?
Завдання 3 (Виправляємо помилку): Студент-стажер написав такий код для видалення товару:
@app.get("/delete_item/{item_id}")
def remove_item(item_id: int):
# логіка видалення з бази
return {"status": "deleted"}
Чому це погана ідея? (Підказка: що буде, якщо Google-бот просканує це посилання?)
Завдання 4 (Міні-кейс):
Ви робите функцію "Лайк".
1. Який шлях ви оберете? (наприклад, /posts/{id}/like)
2. Який метод найкраще підходить? (GET, POST чи DELETE?) Обґрунтуйте.
Завдання 5 (А що, якщо...):
Що станеться, якщо ви відправите запит POST на шлях, для якого у вас в коді прописаний тільки GET? (Спробуйте здогадатися, яку помилку поверне сервер: 200 OK, 404 Not Found чи 405 Method Not Allowed?)
5. 💡 Мислення як у розробника
Ось що відрізняє новачка від профі в цій темі.
1. Семантика має значення
Новачки часто роблять усе через POST або (що ще гірше) через GET.
* Погана практика: GET /add_user?name=Ivan
* Чому? GET запити можуть кешуватися браузером, зберігатися в історії. Уявіть, що хтось побачив вашу історію браузера і випадково "додав користувача" знову.
* Профі думає так: "Якщо я змінюю стан сервера (пишу в базу) — це точно не GET".
2. Ідемпотентність (Страшне слово, проста суть)
Не лякайтесь. Це означає: "Якщо я зроблю цю дію 10 разів поспіль, результат буде такий самий, як після першого разу?"
* DELETE зазвичай ідемпотентний. Якщо ви видалили книгу №5, а потім знову намагаєтесь її видалити — нічого страшного не станеться (її вже нема).
* POST — ні. Якщо ви 10 разів відправите POST /pay, ви 10 разів знімете гроші з картки. Будьте обережні з POST!
3. Шляхи — це іменники
Намагайтеся не використовувати дієслова в URL.
* 🚫 POST /create_user (Масло масляне. POST вже означає "створити")
* ✅ POST /users (Створити в колекції "користувачі")
6. 🧩 Підсумок
Отже, що ми маємо в сухому залишку:
- Path Operation — це комбінація Шляху (адреси) і Методу (дії).
- Ви тепер знаєте CRUD:
GET(читати),POST(створювати),PUT(оновлювати),DELETE(видаляти). - Сервер розрізняє запити не тільки за адресою, а й за методом.
Тепер ви вмієте: Проєктувати "пульт керування" для вашого веб-додатку. Ви знаєте, яку кнопку (метод) натиснути, щоб отримати результат.
🤔 Тизер наступного уроку:
Добре, ми сказали серверу POST /users (Створи користувача). Але... якого саме користувача? Як передати ім'я, пароль та вік так, щоб їх не загубити й перевірити на помилки?
На наступному уроці ми розберемо Request Body (Тіло запиту) та Валідацію даних. Готуйтесь, буде цікаво!