Модуль 6

Path operations і HTTP-методи

Ось готовий урок, створений у стилі Девіда Малана (CS50) — енергійний, зрозумілий та орієнтований на практику.


🎓 Урок: Path Operations і HTTP-методи

(Або: Як змусити сервер вас слухатись)

1. 🔥 Вступ: проблема та мотивація

Привіт усім! Радий вас бачити.

Уявіть, що ви прийшли до ресторану. Ви сідаєте за столик, до вас підходить офіціант, і ви мовчки тицяєте пальцем у рядок меню, де написано "Борщ".

Офіціант дивиться на вас і не розуміє. Чому? Бо ви вказали "що" (Борщ), але не сказали "що з ним зробити". * Ви хочете замовити борщ? * Ви хочете дізнатися склад борщу? * Чи, може, ви хочете повернути борщ на кухню, бо він холодний?

В інтернеті — та сама історія. Коли ви вводите адресу сайту (наприклад, google.com), ви вказуєте серверу "адресу" (Path). Але серверу цього замало! Йому треба знати, яка саме дія (Operation) вам потрібна.

Без цього ми б не мали ані Instagram, ані Telegram, ані онлайн-банкінгу. Ми б мали лише статичні сторінки, на які можна тільки дивитись, але нічого не можна змінити. Нудно, правда?

Сьогодні ми навчимося говорити із сервером повноцінними реченнями. Ми розберемо Path Operations та HTTP-методи.


2. 🧠 Теоретична база (без нудьги)

Давайте заглянемо під капот. Коли ваш браузер (або код) звертається до сервера, він завжди надсилає дві головні речі:

  1. URL (Path / Шлях): Це адреса ресурсу. Наприклад, /users або /items/5. Це наш "Борщ" у меню.
  2. Method (Метод): Це дієслово. Це те, що ми хочемо зробити з цим ресурсом.

"Священна четвірка" методів (CRUD)

У світі вебу є чотири головні дії, які покривають 99% задач. Запам'ятайте абревіатуру CRUD (Create, Read, Update, Delete). Кожній літері відповідає свій HTTP-метод:

  1. GET (Read) 👉 Отримати дані.

    • Аналогія: Ви читаєте меню. Ви нічого не змінюєте на кухні, просто отримуєте інформацію.
    • Приклад: Відкрити стрічку новин.
  2. POST (Create) 👉 Створити щось нове.

    • Аналогія: Ви робите замовлення. На кухні починається робота, з'являється нова страва.
    • Приклад: Опублікувати фото в Instagram, зареєструватися.
  3. PUT (Update) 👉 Оновити/Замінити.

    • Аналогія: Ви передумали й кажете: "Замість супу дайте мені салат".
    • Приклад: Змінити ім'я у профілі.
  4. 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. 🧩 Підсумок

Отже, що ми маємо в сухому залишку:

  1. Path Operation — це комбінація Шляху (адреси) і Методу (дії).
  2. Ви тепер знаєте CRUD: GET (читати), POST (створювати), PUT (оновлювати), DELETE (видаляти).
  3. Сервер розрізняє запити не тільки за адресою, а й за методом.

Тепер ви вмієте: Проєктувати "пульт керування" для вашого веб-додатку. Ви знаєте, яку кнопку (метод) натиснути, щоб отримати результат.

🤔 Тизер наступного уроку: Добре, ми сказали серверу POST /users (Створи користувача). Але... якого саме користувача? Як передати ім'я, пароль та вік так, щоб їх не загубити й перевірити на помилки? На наступному уроці ми розберемо Request Body (Тіло запиту) та Валідацію даних. Готуйтесь, буде цікаво!