Создание одного эндпоинта API

Разработка программного обеспечения с Claude Code

Dani Zysman

AI Curriculum Manager @ DataCamp

От запроса к API

recraft: half: Разработчик за рабочим столом с ассистентом Claude AI, который помогает создавать API — на экране код и подключение к базе данных

  • Предыдущее видео: интерактивные запросы к базе данных
  • Сейчас: добавляем эндпоинт в Music Analytics API
    • Один промпт — один рабочий эндпоинт, настоящий код на Python
Разработка программного обеспечения с Claude Code

Текущее состояние проекта

music-analytics-api/
  app.py             # Existing API (updated to register db_routes)
  routes.py          # Existing routes
  models.py          # Artist/Album models
  db_routes.py       # <- New database-backed Blueprint
  chinook.db
  test_routes.py
  CLAUDE.md
Разработка программного обеспечения с Claude Code

Просим Claude создать эндпоинт

> Create a new db_routes.py blueprint with an endpoint at 
/artists/<artist_id>/albums that returns all albums by 
a specific artist as JSON from chinook,db. Register it with @app.py
1. db_routes py - New Flask Blueprint with:
    - get_db_connection() helper to connect to chinook.db
    - Added endpoint that queries the database for all albums by a specific artist
    - Returns JSON with AlbumId, Title, and ArtistId fields
2. Updated app.py 
    - Registered the blueprint so the new endpoint is active

The endpoint will return a 404 if the artist doesn't exist, 
and returns albums sorted by title as JSON.
Разработка программного обеспечения с Claude Code

Сгенерированный код

@app.route("/artists/<int:artist_id>/albums")
def get_artist_albums(artist_id):
    conn = get_db()
    artist = conn.execute("SELECT ... WHERE ArtistId = ?", ...)
    albums = conn.execute("SELECT ... WHERE ArtistId = ?", ...)
    conn.close()
    return jsonify({"artist": ..., "albums": [...]})
Разработка программного обеспечения с Claude Code

Тестируем локально

$ python app.py & PID=$! && sleep 3 && curl http://127.0.0.1:5000/artists/1/albums
&& kill $PID
127.0.0.1 "GET /artists/1/albums HTTP/1.1" 200
[
    {
     "album_id": 1,
     "artist_id": 1,
     "title": "For Those About To Rock We Salute You"
    },
    {
     "album_id": 4,
     "artist_id": 1,
     "title": "Let There Be Rock"
    }
]
Разработка программного обеспечения с Claude Code

Обработка крайних случаев

  • Что если...
    • ID исполнителя не существует?
    • У исполнителя нет альбомов?
    • Неверный формат ID?
    • Текущий код возвращает пустой {"albums": []}
  • Более понятные ответы:
    • 404 с понятным сообщением
    • Проверенная структура ответа
    • Корректная обработка ошибок
Разработка программного обеспечения с Claude Code

Добавляем валидацию с Pydantic

from pydantic import BaseModel
from typing import List

class Album(BaseModel):
    id: int
    title: str

class ArtistAlbums(BaseModel):
    artist_id: int
    albums: List[Album]
  • Pydantic обеспечивает:
    • Проверку типов
    • Автоматическую сериализацию
    • Понятные сообщения об ошибках
    • Самодокументируемые схемы
Разработка программного обеспечения с Claude Code

Просим Claude добавить валидацию

> Add Pydantic validation to @db_routes.py. Return 404 with a message if the 
artist doesn't exist or has no albums.
Done! Added Pydantic validation to db_routes.py:
Changes:
- Added Album model (album_id, title, artist_id)
- Returns 404 "Artist not found" if artist doesn't exist
- Returns 404 "Artist has no albums" if artist has no albums
- Validates each album against Album model before returning
- Returns 400 on validation errors
Responses:
- 404 "Artist not found"
- 404 "Artist has no albums"  
- 200 with validated album data
Разработка программного обеспечения с Claude Code

Давайте потренируемся!

Разработка программного обеспечения с Claude Code

Preparing Video For Download...