Crea un endpoint API

Sviluppo software con Claude Code

Dani Zysman

AI Curriculum Manager @ DataCamp

Dalla query all'API

recraft: half: Uno sviluppatore alla scrivania con l'assistente Claude AI che aiuta a creare un'API, con codice a schermo e connessione al database

  • Video precedente: Query interattive al database
  • Ora: Aggiungi un endpoint alla Music Analytics API
    • Un prompt, un endpoint funzionante, vero codice Python
Sviluppo software con Claude Code

Il progetto finora

music-analytics-api/
  app.py             # API esistente (aggiornata per registrare db_routes)
  routes.py          # Route esistenti
  models.py          # Modelli Artist/Album
  db_routes.py       # <- Nuovo Blueprint con database
  chinook.db
  test_routes.py
  CLAUDE.md
Sviluppo software con Claude Code

Chiedi a Claude di crearlo

> Crea un nuovo blueprint db_routes.py con un endpoint su 
/artists/<artist_id>/albums che restituisce tutti gli album di 
un artista specifico come JSON da chinook,db. Registralo in @app.py
1. db_routes py - Nuovo Blueprint Flask con:
    - helper get_db_connection() per connettersi a chinook.db
    - Endpoint che interroga il database per tutti gli album di un artista specifico
    - Restituisce JSON con campi AlbumId, Title e ArtistId
2. Aggiornato app.py 
    - Registrato il blueprint così il nuovo endpoint è attivo

L'endpoint restituisce 404 se l'artista non esiste 
e restituisce gli album ordinati per titolo in JSON.
Sviluppo software con Claude Code

Il codice generato

@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": [...]})
Sviluppo software con Claude Code

Provalo in locale

$ 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"
    }
]
Sviluppo software con Claude Code

Gestire i casi limite

  • E se...
    • L'ID artista non esiste?
    • L'artista non ha album?
    • Formato ID non valido?
    • Il codice attuale restituisce {"albums": []}
  • Risposte migliori:
    • 404 con messaggio chiaro
    • Struttura della risposta validata
    • Gestione errori corretta
Sviluppo software con Claude Code

Aggiungi validazione con 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 offre:
    • Validazione dei tipi
    • Serializzazione automatica
    • Messaggi di errore chiari
    • Schemi auto-documentanti
Sviluppo software con Claude Code

Chiedi a Claude di aggiungere la validazione

> Aggiungi la validazione Pydantic a @db_routes.py. Restituisci 404 con un messaggio se 
l'artista non esiste o non ha album.
Fatto! Aggiunta la validazione Pydantic a db_routes.py:
Modifiche:
- Aggiunto modello Album (album_id, title, artist_id)
- Restituisce 404 "Artist not found" se l'artista non esiste
- Restituisce 404 "Artist has no albums" se l'artista non ha album
- Valida ogni album rispetto al modello Album prima di restituire
- Restituisce 400 su errori di validazione
Risposte:
- 404 "Artist not found"
- 404 "Artist has no albums"  
- 200 con dati album validati
Sviluppo software con Claude Code

Esercitiamoci!

Sviluppo software con Claude Code

Preparing Video For Download...