Implementare gli endpoint della REST API
È il momento della parte divertente! Creiamo gli endpoint REST API per i nostri libri. Aggiungeremo l'implementazione degli endpoint nel file routes.py e caricheremo le route nel file main.py. Inizieremo inizializzando un oggetto APIRouter in routes.py:
pymongo-fastapi-crud/routes.py
Come puoi notare, stiamo importando APIRouter dal pacchetto fastapi. Utilizzeremo questo oggetto per definire gli endpoint per la nostra REST API. Stiamo anche importando i modelli Book e BookUpdate che abbiamo definito in precedenza.
POST /book
Il primo endpoint che implementeremo è l'endpoint POST /books per la creazione di un nuovo libro. Aggiungi quanto segue dopo la riga router = APIRouter():
pymongo-fastapi-crud/routes.py
Il percorso è / perché anteporremo a tutti gli endpoint dei libri /books. response_description sarà visualizzato nella documentazione dell'API. status_code è il codice di stato HTTP restituito quando la richiesta ha esito positivo. Usiamo il modello Book per convalidare sia i dati trasmessi nel corpo della richiesta che la risposta che abbiamo inviato. FastAPI gestisce la convalida per noi. Nel corpo della funzione, usiamo il metodo insert_one() di PyMongo per aggiungere il nuovo libro alla raccoltabooks. Usiamo il metodo find_one() per recuperare il libro appena creato dal database. Puoi leggere di più sui metodi insert_one() e find_one() nell'articolo della documentazione di PyMongo per operazioni a livello di tabella.
Infine, restituiamo il libro creato.
GET /book
Successivamente, implementeremo l'endpoint GET /book per restituire un elenco con tutti i documenti nella raccolta books. Aggiungi quanto segue alla fine del file routes.py:
pymongo-fastapi-crud/routes.py
Per il modello di risposta, utilizziamo il tipo List[Book]. Ciò significa che la risposta sarà un elenco di oggetti Book. Usiamo anche il metodo find() per recuperare non più di 100 libri dal database. Per ulteriori informazioni su limit e sugli altri parametri del metodo find(), consulta la pagina di documentazione dedicata a PyMongo.
GET /libro/{id}
Creiamo un altro endpoint GET per recuperare un singolo libro in base al suo id. Aggiungi quanto segue alla fine del file routes.py:
pymongo-fastapi-crud/routes.py
Qui utilizziamo il metodo find_one() per recuperare un singolo libro dal database. Se troviamo il libro, produrremo il risultato. Se il libro non viene trovato, solleveremo un'HTTPException con un codice di stato 404 Not Found e un messaggio appropriato.
PUT /book/{id}
Probabilmente, l'endpoint più importante per la nostra REST API è l'endpoint PUT /book/{id}. Questo endpoint ci consente di aggiornare un singolo libro. Aggiungi l'implementazione alla fine del file routes.py:
pymongo-fastapi-crud/routes.py
Dedichiamoci al codice. Per prima cosa, creiamo un oggetto che useremo per aggiornare il libro. Quindi, se ci sono campi nell'oggetto book, utilizziamo il metodo update_one() per aggiornare il libro nel database. È importante notare che stiamo utilizzando l'operatore di aggiornamento $set per garantire che solo i campi specificati vengano aggiornati invece di riscrivere l'intero documento.
Quindi, verifichiamo l'attributo modified_count di update_result per assicurarci che il libro sia stato aggiornato. Se è così, stiamo utilizzando il metodo find_one() per recuperare il libro aggiornato dal database e restituirlo.
Se non ci sono campi nell'oggetto book, restituiamo semplicemente il libro esistente. Tuttavia, se il libro non viene trovato, genereremo un'HTTPException con un codice di stato 404 Not Found.
DELETE /book/{id}
L'ultimo endpoint che implementeremo è l'endpoint DELETE /book/{id} per eliminare un singolo libro in base al suo id. Aggiungi quanto segue alla fine del file routes.py:
pymongo-fastapi-crud/routes.py
L'unica cosa degna di nota è che se il libro è stato cancellato, restituiamo un codice di stato 204 No Content. Questo è un codice di stato di successo che indica che la richiesta è stata completata e che non esiste contenuto da inviare nel corpo del payload di risposta.
Registrare gli
Infine, è necessario registrare gli endpoint /book. Aprire il file main.py, importa il modulo routes e registra il router dei libri. La tua versione finale del file main.py dovrebbe apparire come segue:
pymongo-fastapi-crud/main.py