1. Partez du besoin
Imaginez un petit tableau de bord utilisé sur votre machine. Il doit afficher deux notes de formation. Il ne doit pas ouvrir l’interface d’administration ni connaître la table PostgreSQL. Il demande simplement les notes à Odoo à l’adresse locale /training/api/notes.
Pour ce premier essai, Odoo renverra deux notes écrites directement dans le contrôleur. Cette étape permet de vérifier le passage entre une autre interface et Odoo sans interroger le modèle.
Autre interface
│
│ /training/api/notes
▼
Odoo
│
│ deux notes et leur nombre
▼
Autre interface2. Créez le contrôleur
Dans le module training_hello, créez le fichier controllers/notes_api.py avec le contenu complet suivant.
from odoo import http
from odoo.http import request
class TrainingNotesApiController(http.Controller):
@http.route(
"/training/api/notes",
type="http",
auth="public",
methods=["GET"],
)
def list_notes(self):
payload = {
"notes": [
{
"id": 1,
"title": "Bienvenue",
"body": "Découvrez les notes depuis une API locale.",
},
{
"id": 2,
"title": "À tester",
"body": "Appelez cette route avec cURL.",
},
],
"count": 2,
}
return request.make_json_response(payload)Gardez cette version volontairement petite. Elle ne contient ni request.env, ni recherche ORM, ni sudo(). Les deux notes sont des données de démonstration locales, pas des données de production.
auth="public" permet ici d’appeler l’adresse sans ouvrir une session utilisateur. Cette première version est donc anonyme. Vous étudierez la protection de ce point d’accès plus tard dans la journée.
3. Importez le nouveau fichier
Créer le fichier ne suffit pas : Python doit aussi le charger. Dans controllers/__init__.py, conservez les imports déjà présents et ajoutez la ligne suivante.
from . import notes_apiLe fichier __init__.py à la racine de training_hello importe déjà le dossier controllers. Gardez cette ligne existante ; n’en ajoutez pas une seconde.
4. Redémarrez Odoo et observez la réponse
Action qui redémarre Odoo : arrêtez puis relancez votre processus Odoo selon la méthode habituelle de votre environnement. Attendez que les journaux indiquent que le serveur est de nouveau prêt. Une simple actualisation du navigateur ne suffit pas, car vous avez ajouté un fichier Python et un import.
Vous n’avez modifié ni champ, ni fichier XML, ni manifeste. Il n’est donc pas nécessaire de mettre le module à niveau pour cette étape : le redémarrage suffit.
Ouvrez ensuite http://127.0.0.1:8069/training/api/notes dans votre navigateur. La section 2 vous montrera comment appeler la même adresse depuis un terminal avec cURL.
Le corps de la réponse doit contenir exactement ces valeurs. Les espaces et les retours à la ligne peuvent différer selon l’outil qui l’affiche.
{
"notes": [
{
"id": 1,
"title": "Bienvenue",
"body": "Découvrez les notes depuis une API locale."
},
{
"id": 2,
"title": "À tester",
"body": "Appelez cette route avec cURL."
}
],
"count": 2
}Point de contrôle — vérifiez la réponse
Après le redémarrage, vérifiez concrètement que la réponse contient deux objets dans notes, que count vaut 2 et que chaque objet contient uniquement id, title et body.