Web service sous fastAPI (Janvier 2026)
Source Building Python Web APIs with FastAPI
Première mise en oeuvre d’un petit service avec Validation
api.py
from fastapi import FastAPI
from todo import todo_router
app = FastAPI()
@app.get("/")
async def welcome() -> dict:
return { "message": "Hello World"}
app.include_router(todo_router)
model.py
from pydantic import BaseModel
class Todo(BaseModel):
id: int
item: str
todo.py
from fastapi import APIRouter
from model import Todo
todo_router = APIRouter()
todo_list = []
@todo_router.post("/todo")
async def add_todo(todo: Todo) -> dict:
todo_list.append(todo)
return {"message": "Todo added successfully"}
@todo_router.get("/todo")
async def retrieve_todos() -> dict:
return {"todos": todo_list}
Explication sur le fonctionnement et l’utilisation de ce web service très simple
Pour démarrer et activer le web service utilisez la commande suivante :
uvicorn api:app --port 8005 --reload
INFO: Will watch for changes in these directories: ['/home/ystroppa/fastAPI']
INFO: Uvicorn running on http://127.0.0.1:8005 (Press CTRL+C to quit)
INFO: Started reloader process [22901] using StatReload
INFO: Started server process [22903]
INFO: Waiting for application startup.
INFO: Application startup complete.
Utilisation et vérification du fonctionnement
A partir d’un autre terminal, on peut utiliser les instructions suivantes :
Pour un ajout qui ne respecte par le modèle définie
curl -X 'POST' 'http://127.0.0.1:8000/todo' -H 'accept: application/json' -H 'Content-Type: application/json' -d '{}'
{"detail":[{"type":"missing","loc":["body","id"],"msg":"Field required","input":{}},{"type":"missing","loc":["body","item"],"msg":"Field required","input":{}}]}
Pour un ajout d’un nouvel item qui respecte le modèle définie
curl -X 'POST' 'http://127.0.0.1:8005/todo' -H 'accept: application/json' -H 'Content-Type: application/json' -d '{"id": 2,"item": "Validation models help with input types"}'
{"message":"Todo added successfully"}
Pour lister les items existants dans la dictionnaire interne
curl http://0.0.0.0:8005/todo
{"todos":[{"id":2,"item":"Validation models help with input types"},{"id":2,"item":"Validation models help with input types"}]}
Petite explication : la vérification et le contrôle de l’envoie des données se fait à l’aide de pydantic qui permet de convertir et de contrôler les données transmises.
On peut étendre le concept des modèles par des structures nested (imbriquées) de la façon suivante :
class Item(BaseModel)
item: str
status: str
class Todo(BaseModel)
id: int
item: Item
Ce qui nous permetrait de créer des structures de type :
{
"id": 1,
"item": {
"item": "Nested models",
"Status": "completed"
}
}
Chemin d’accès et requête : si on souhaite extraire non pas la liste complète mais un item à partir de son id il nous suffit de redéfinir un chemin spécifique et dédié dans le fichier todo.py ce qui nous donne
from fastapi import APIRouter, Path
from model import Todo
todo_router = APIRouter()
todo_list = []
@todo_router.post("/todo")
async def add_todo(todo: Todo) -> dict:
todo_list.append(todo)
return {
"message": "Todo added successfully."
}
@todo_router.get("/todo")
async def retrieve_todo() -> dict:
return {
"todos": todo_list
}
@todo_router.get("/todo/{todo_id}")
async def get_single_todo(todo_id: int = Path(..., title="The ID of the todo to retrieve.")) -> dict:
for todo in todo_list:
if todo.id == todo_id:
return {
"todo": todo
}
return {
"message": "Todo with supplied ID doesn't exist."
}
Et pour récupérer le contenu :
curl -X 'GET' 'http://127.0.0.1:8005/todo/2' -H 'accept: application/json'
On a de façon implicite swagger pour les accès aux descripteurs des fonctions
On y accède par l’url suivante : http://localhost:8005/docs#/

Partie persistance : voir aussi lien