Первый работающий API

Query-параметры и фильтрация каталога

Содержание курса

Полный маршрут и проверка результатов запросов

Каталог содержит три переговорные: Лондон (6 мест, проектор есть), Берлин (12 мест, проектора нет), Токио (4 места, проектор есть).

from fastapi import FastAPI
from typing import Optional

app = FastAPI()

rooms_by_id = {
    1: {"id": 1, "name": "Лондон", "floor": 2, "capacity": 6, "has_projector": True},
    2: {"id": 2, "name": "Берлин", "floor": 3, "capacity": 12, "has_projector": False},
    3: {"id": 3, "name": "Токио", "floor": 1, "capacity": 4, "has_projector": True},
}

@app.get("/api/rooms")
def list_rooms(min_capacity: int = 0, has_projector: Optional[bool] = None):
    result = [r for r in rooms_by_id.values() if r["capacity"] >= min_capacity]
    if has_projector is not None:
        result = [r for r in result if r["has_projector"] == has_projector]
    return result

Проверим разные комбинации запросов:

  • GET /api/rooms — оба параметра по умолчанию, фильтры не применяются. Ответ 200: все три комнаты.
  • GET /api/rooms?min_capacity=6 — остаются Лондон (6 ≥ 6) и Берлин (12 ≥ 6). Токио (4) не проходит. Ответ 200: два объекта.
  • GET /api/rooms?min_capacity=6&has_projector=true — из Лондона и Берлина проектор есть только у Лондона. Ответ 200: один объект.
  • GET /api/rooms?has_projector=false — без ограничения по вместимости, только без проектора. Ответ 200: только Берлин.
  • GET /api/rooms?min_capacity=100 — ни одна комната не вмещает 100 человек. Ответ 200: пустой массив [].
  • GET /api/rooms?min_capacity=abc — строка abc не является целым числом. FastAPI вернёт 422 до вызова функции.
  • GET /api/rooms?has_projector=maybe — недопустимое булево значение. Тоже 422.

После любого из этих запросов GET /api/rooms без параметров снова вернёт все три комнаты: словарь rooms_by_id не изменился.

Исходные комнаты: Лондон — 6 мест с проектором, Берлин — 12 без проектора, Токио — 4 с проектором. После capacity >= 6 остаются Лондон и Берлин. has_projector=None оставляет обоих, True — Лондон, False — Берлин.
После отбора по вместимости None не ограничивает оборудование, а False оставляет только комнаты без проектора.