Модуль 7

Path parameters

Ось готовий урок на тему Path parameters, створений у стилі CS50 (David Malan).


🎓 Урок: Path Parameters (Параметри шляху)

Привіт, друзі! 👋 Це CS50, і сьогодні ми розберемо тему, яка перетворить ваш код із набору жорстких інструкцій на гнучку, живу систему.

Ми говоримо про Path Parameters (параметри шляху).


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

Уявіть, що ви створюєте свій власний Instagram. У вас є мільйон користувачів. Як ви напишете код, щоб показати профіль кожного з них?

Невже ви будете писати окрему функцію для кожного юзера?

@app.get("/users/andrii")
def get_andrii():
    return "Це профіль Андрія"

@app.get("/users/olena")
def get_olena():
    return "Це профіль Олени"

А якщо зареєструється ще 1000 людей? Ви що, будете сидіти всю ніч і копіювати цей код тисячу разів? Звісно, ні. Це безумство. 🤯

Тут виникає проблема: нам потрібен один універсальний маршрут, який може обробляти будь-яке ім'я користувача.

Аналогія: Уявіть готель. На дверях кожного номера є табличка: 101, 102, 103. Прибиральнику не дають окрему інструкцію для кожної кімнати ("Прибери 101", "Прибери 102"...). Йому кажуть: "Прибери кімнату номер X", де X — це змінна.

У вебі цей "номер кімнати" і є Path Parameter. Без цього ми б не мали ні Facebook, ни Amazon, ні Вікіпедії.


2. 🧠 Теоретична база (без сухої академічності)

Що таке Path Parameter?

Path Parameter — це змінна частина URL-адреси, яку сервер "вирізає" з посилання і передає вашій функції як звичайну змінну.

Як це працює "під капотом"?

Коли ви заходите на сайт shop.com/products/42: 1. Ваш браузер надсилає запит на цей URL. 2. Сервер (ваш бекенд) дивиться на свої маршрути. Він не шукає точний збіг /products/42. 3. Він шукає шаблон: /products/{id}. 4. Сервер розуміє: "Ага! Користувач хоче продукт, і замість {id} він написав 42". 5. Він запускає вашу функцію і передає їй id = 42.

🔑 Що треба запам'ятати залізно:

  • Параметр шляху — це частина адреси (не те, що йде після ?).
  • Він використовується для ідентифікації конкретного ресурсу (конкретний юзер, конкретний товар, конкретна стаття).

3. 🧪 Приклади (від простого до реального)

Давайте подивимось на код. Я буду використовувати синтаксис, схожий на Python (FastAPI/Flask), бо він читається як псевдокод, але логіка однакова і для JavaScript (Express), і для Go, і для Java.

Приклад 1: "Привіт, {хтось}!"

Найпростіший випадок. Ми хочемо вітатися з будь-ким.

# Фігурні дужки {} означають, що це змінна
@app.get("/hello/{name}")
def say_hello(name):
    return f"Привіт, {name}!"

Питання до вас: Якщо я перейду за посиланням /hello/David, що поверне сервер? (Пауза на подумати...) Правильно: "Привіт, David!". А змінна name всередині функції отримає значення "David".


Приклад 2: Типізація (Це важливо!)

Уявіть інтернет-магазин. У кожного товару є числовий ID.

@app.get("/items/{item_id}")
def get_item(item_id: int): # Ми вказуємо, що чекаємо число!
    return {"item_id": item_id, "name": "Якийсь товар"}

Що буде, якщо я перейду на /items/banana? Ваш код очікує число (int), а ви передали слово "banana". Розумний фреймворк автоматично видасть помилку (наприклад, 422 Validation Error). І це круто! Це захищає вашу базу даних від сміття.


Приклад 3: Кілька параметрів

Шлях може бути довгим і мати кілька змінних. Наприклад, категорія і ID товару.

@app.get("/catalog/{category_name}/products/{product_id}")
def get_product(category_name, product_id):
    return {
        "category": category_name,
        "product": product_id,
        "message": f"Ви шукаєте товар {product_id} у категорії {category_name}"
    }

URL: /catalog/electronics/products/55 Результат: * category_name = "electronics" * product_id = "55"

Бачите? Ми розбили URL на змістові шматки.


4. 🛠 Практична частина

А тепер ваша черга! Відкрийте редактор коду (або уявіть його) і вирішіть ці задачі.

🔹 Завдання 1: Відлуння Напишіть маршрут /echo/{word}, який просто повертає те саме слово, яке ввів користувач, але тричі. Вхід: /echo/hello $\to$ Вихід: "hello hello hello"

🔹 Завдання 2: Калькулятор в URL Створіть маршрут /add/{a}/{b}, який приймає два числа і повертає їх суму. Вхід: /add/10/5 $\to$ Вихід: 15

🔹 Завдання 3: Виправ помилку (Debug) У вас є такий код:

@app.get("/users/{user_id}")
def get_user(user_id):
    return "User ID is " + user_id

@app.get("/users/me")
def get_current_user():
    return "Це я, адмін!"

Ви переходите на /users/me, але сервер каже: "User ID is me". Чому не спрацював другий маршрут? Як це виправити? (Підказка: порядок має значення!)

🔹 Завдання 4: Міні-кейс "Блог" Придумайте структуру URL для доступу до коментарів конкретної статті. Наприклад, у вас є стаття з id=100 і ви хочете отримати коментар з id=5. Як виглядатиме шлях? Напишіть сигнатуру функції.

🔹 Завдання 5: А що, якщо...? Що має зробити ваш код, якщо користувач перейшов на /items/9999, а товару з таким ID у вашій базі даних немає? (Подумайте про HTTP статус-коди. 200 OK тут не підходить).


5. 💡 Мислення як у розробника

Ось де ми відокремлюємо новачків від профі. Як мислить інженер?

  1. Порядок маршрутів (Route Order) — це класична пастка.

    • Проблема: Комп'ютер читає код згори вниз. Якщо ви поставите загальний шаблон /users/{id} вище, ніж конкретний /users/me, то "me" буде сприйнято як id.
    • Рішення: Завжди ставте конкретні (статичні) маршрути вище за динамічні шаблони. Спочатку винятки, потім правила.
  2. Валідація типів.

    • Не вірте користувачеві. Якщо id має бути числом — вимагайте число на рівні коду. Якщо це UUID — перевіряйте формат. Це вбереже вас від SQL-ін'єкцій та зламаної логіки.
  3. Семантика URL (RESTful design).

    • Погано: /get_user_by_id/{id} (дієслово в URL зайве, метод GET і так це каже).
    • Добре: /users/{id} (іменник, чітко і ясно).

6. 🧩 Підсумок

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

  1. Path Parameters дозволяють створювати динамічні URL-адреси.
  2. Вони діють як змінні у вашому коді.
  3. Вони ідеальні для пошуку конкретних ресурсів (ID, username, slug).
  4. Порядок написання маршрутів у коді критично важливий.

Тепер ви вмієте: створювати API, яке масштабується на мільйони користувачів, не пишучи мільйон рядків коду.

🚀 Що далі? Ви запитаєте: "Добре, Девіде, я можу знайти конкретний товар. А як мені знайти всі дешеві товари або відсортувати їх за ціною?" Для цього нам знадобляться Query Parameters (параметри запиту). Але про це — наступного разу.

Це був CS50. Щасти вам з кодом!