C'est un excellent défi !
Pour créer une API en Python, je vais choisir d'utiliser le framework
FastAPI. C'est actuellement l'un des choix les plus modernes et efficaces pour construire des
APIs de manière rapide et sécurisée.
📚 Le Projet Choisi : Une API de Gestion de Catalogue de Livres (Book Inventory)
Objectif : Créer une API simple qui permet de gérer un inventaire de livres. L'utilisateur
pourra ajouter de nouveaux livres, récupérer la liste complète, ou consulter les détails d'un
livre spécifique.
Technologies utilisées :
Python 3.x (Le langage).
FastAPI (Le framework pour construire l'API).
Pydantic (Pour valider et structurer automatiquement les données entrantes et
sortantes, ce qui est essentiel dans une API).
Étape 1 : Préparation de l'environnement
Avant le code, vous devez installer les bibliothèques nécessaires. Ouvrez votre terminal ou
invite de commande :
bash
pip install fastapi "uvicorn[standard]" pydantic
pip install fastapi "uvicorn[standard]" pydantic
Étape 2 : Le Code Python (fichier [Link])
Voici tout le code que vous devez placer dans un fichier nommé [Link].
python
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel # Utilisé pour définir les modèles de données
# --- Initialisation de l'application FastAPI ---
app = FastAPI(title="Book Inventory API", description="API simple pour gérer un catalogue de
livres.")
# --- 📚 Simulation d'une Base de Données (En mémoire) ---
# Dans une vraie application, cette liste serait remplacée par une connexion à PostgreSQL,
MongoDB, etc.
books_db = {}
next_book_id = 1
def get_mock_books():
"""Initialise quelques données factices pour le test."""
global next_book_id
# Premier livre (ID 1)
books_db[next_book_id] = {
"title": "Le Seigneur des Anneaux",
"author": "J.R.R. Tolkien",
"isbn": "978-0618266235",
"year": 1954
next_book_id += 1
# Exécuter l'initialisation des données au démarrage
get_mock_books()
# --- 📘 Définition du Modèle de Données avec Pydantic ---
# Pydantic assure que toute donnée qui entre ou sort respecte cette structure.
class Book(BaseModel):
title: str
author: str
isbn: str
year: int
# --- 🚀 Les Endpoints de l'API (Les fonctions métier) ---
# ENDPOINT 1 : Récupérer tous les livres (GET /books)
@[Link]("/books", response_model=list[Book])
def get_all_books():
"""Retourne la liste complète des livres dans le catalogue."""
return list(books_db.values())
# ENDPOINT 2 : Créer un nouveau livre (POST /books)
@[Link]("/books", response_model=Book)
def create_book(book: Book):
"""Ajoute un nouveau livre à l'inventaire."""
global next_book_id
# On assigne automatiquement le prochain ID disponible
new_book_data = [Link]()
books_db[next_book_id] = new_book_data
# Incrémente l'ID pour la prochaine création
next_book_id += 1
return books_db[next_book_id - 1]
# ENDPOINT 3 : Récupérer un livre spécifique (GET /books/{book_id})
@[Link]("/books/{book_id}", response_model=Book)
def get_book(book_id: int):
"""Récupère les détails d'un livre par son ID."""
if book_id not in books_db:
# Si le livre n'existe pas, on lève une exception HTTP 404
raise HTTPException(status_code=404, detail="Livre non trouvé.")
return books_db[book_id]
# ENDPOINT 4 : Mettre à jour un livre existant (PUT /books/{book_id})
@[Link]("/books/{book_id}", response_model=Book)
def update_book(book_id: int, book: Book):
"""Met à jour toutes les informations d'un livre existant."""
if book_id not in books_db:
raise HTTPException(status_code=404, detail="Livre non trouvé.")
# On met à jour l'entrée dans notre "base de données"
books_db[book_id] = [Link]()
return books_db[book_id]
# OPTIONNEL : Endpoints d'exemple pour les autres opérations (DELETE)
@[Link]("/books/{book_id}")
def delete_book(book_id: int):
"""Supprime un livre de l'inventaire."""
if book_id not in books_db:
raise HTTPException(status_code=404, detail="Livre non trouvé.")
del books_db[book_id]
return {"message": f"Le livre avec ID {book_id} a été supprimé."}
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel # Utilisé pour définir les modèles de données
# --- Initialisation de l'application FastAPI ---
app = FastAPI(title="Book Inventory API", description="API simple pour gérer un catalogue de
livres.")
# --- 📚 Simulation d'une Base de Données (En mémoire) ---
# Dans une vraie application, cette liste serait remplacée par une connexion à PostgreSQL,
MongoDB, etc.
books_db = {}
next_book_id = 1
def get_mock_books():
"""Initialise quelques données factices pour le test."""
global next_book_id
# Premier livre (ID 1)
books_db[next_book_id] = {
"title": "Le Seigneur des Anneaux",
"author": "J.R.R. Tolkien",
"isbn": "978-0618266235",
"year": 1954
next_book_id += 1
# Exécuter l'initialisation des données au démarrage
get_mock_books()
# --- 📘 Définition du Modèle de Données avec Pydantic ---
# Pydantic assure que toute donnée qui entre ou sort respecte cette structure.
class Book(BaseModel):
title: str
author: str
isbn: str
year: int
# --- 🚀 Les Endpoints de l'API (Les fonctions métier) ---
# ENDPOINT 1 : Récupérer tous les livres (GET /books)
@[Link]("/books", response_model=list[Book])
def get_all_books():
"""Retourne la liste complète des livres dans le catalogue."""
return list(books_db.values())
# ENDPOINT 2 : Créer un nouveau livre (POST /books)
@[Link]("/books", response_model=Book)
def create_book(book: Book):
"""Ajoute un nouveau livre à l'inventaire."""
global next_book_id
# On assigne automatiquement le prochain ID disponible
new_book_data = [Link]()
books_db[next_book_id] = new_book_data
# Incrémente l'ID pour la prochaine création
next_book_id += 1
return books_db[next_book_id - 1]
# ENDPOINT 3 : Récupérer un livre spécifique (GET /books/{book_id})
@[Link]("/books/{book_id}", response_model=Book)
def get_book(book_id: int):
"""Récupère les détails d'un livre par son ID."""
if book_id not in books_db:
# Si le livre n'existe pas, on lève une exception HTTP 404
raise HTTPException(status_code=404, detail="Livre non trouvé.")
return books_db[book_id]
# ENDPOINT 4 : Mettre à jour un livre existant (PUT /books/{book_id})
@[Link]("/books/{book_id}", response_model=Book)
def update_book(book_id: int, book: Book):
"""Met à jour toutes les informations d'un livre existant."""
if book_id not in books_db:
raise HTTPException(status_code=404, detail="Livre non trouvé.")
# On met à jour l'entrée dans notre "base de données"
books_db[book_id] = [Link]()
return books_db[book_id]
# OPTIONNEL : Endpoints d'exemple pour les autres opérations (DELETE)
@[Link]("/books/{book_id}")
def delete_book(book_id: int):
"""Supprime un livre de l'inventaire."""
if book_id not in books_db:
raise HTTPException(status_code=404, detail="Livre non trouvé.")
del books_db[book_id]
return {"message": f"Le livre avec ID {book_id} a été supprimé."}
Étape 3 : Comment exécuter l'API (Testing)
1. Démarrer le serveur : Retournez dans votre terminal et lancez la commande
suivante :
bash
uvicorn main:app --reload
uvicorn main:app --reload
Explication : main fait référence à votre fichier [Link], : indique l'objet FastAPI, et app est le
nom de cette variable. --reload permet au serveur de redémarrer automatiquement quand
vous modifiez le code (très pratique en développement).
2. Tester l'API : Une fois que le terminal affiche un message indiquant que le serveur a
démarré (souvent [Link] votre API est active !
o Documentation Interactive : Le meilleur moyen de tester l'API est d'aller sur
[Link] FastAPI a généré automatiquement une interface
utilisateur (Swagger UI) qui vous permet de voir tous les endpoints, de
comprendre les requêtes attendues et de cliquer sur "Try it out" pour tester
chaque fonction directement dans votre navigateur.
🌟 Résumé du Fonctionnement
Méthode Endpoint
Description Exemple d'utilisation
HTTP URL
GET /books Récupère tous les livres. [Link]
POST /books Crée un nouveau livre Envoyez dans le corps la donnée : {"title":
Méthode Endpoint
Description Exemple d'utilisation
HTTP URL
(vous devez envoyer le
"DDD", "author": "Sark", ...}
JSON du livre).
Récupère un livre précis
GET /books/{id} [Link]
par son ID.
Modifie complètement les
[Link] (avec le
PUT /books/{id} données d'un livre
nouveau JSON)
existant.
Supprime un livre de
DELETE /books/{id} [Link]
l'inventaire.