ADR-026 : Nommer les accesseurs de Request par leur source : query et route¶
Statut¶
Accepté, Forge 1.0.0-beta.15 (ticket HTTP-REQUEST-PARAM-RENAME-001).
Date¶
2026-06-07
Contexte¶
core.http.request.Request expose une famille d'accesseurs de données, nommés
par leur source :
| Méthode | Source |
|---|---|
param(key) |
query string (?clé=) |
route_param(key) |
chemin de l'URL (/article/{id}) |
form(key) |
corps de formulaire |
json(key) |
corps JSON |
header(name) |
en-tête HTTP |
file(key) |
fichier téléversé |
Deux noms dénotent par rapport au reste de la famille :
paramne nomme pas sa source. C'est le seul membre dont le nom est
générique : il ne dit pas que la valeur vient de la query string. Tous les
autres nomment un lieu précis.route_paramest asymétrique avecparam(suffixe_paramque les
autres lecteurs n'ont pas) et un peu imprécis : une route est l'objet
complet (méthode + motif + handler), alors que la valeur vient du chemin.
Contraintes établies¶
request.pathexiste déjà comme attribut (la chaîne du chemin,
request.py), convention quasi universelle (Flask, Django, Express). Une
méthodepath()entrerait en collision : le nom nupathest donc exclu.request.queryetrequest.routesont libres (aucun attribut ni méthode
existant). « route » est déjà le vocabulaire de Forge (route_param,
router.group, starters*-route).- Phase bêta pré-1.0 : une rupture interne de l'API se fait sans alias ni
dépréciation (convention deCLAUDE.md). C'est la fenêtre idéale ; après le
tag 1.0 stable, ce renommage serait beaucoup plus coûteux.
Décision¶
- D1 :
Request.paramest renomméRequest.query(lit la query
string). - D2 :
Request.route_paramest renomméRequest.route(lit un
paramètre du chemin de route dynamique). - D3 : les autres accesseurs (
form,json,header,file) sont déjà
nommés par leur source et ne changent pas. - D4 : pas d'alias de compatibilité (rupture franche, pré-1.0). Tous les
appels sont migrés dans le même chantier : core, starters, tutoriel
welcome-forge, tests, faux objets de test, contrat public 1.0, doc HTTP.
La paire obtenue est nue, brève, symétrique et nomme la source :
query / route / form / json / header / file.
Conséquences¶
Positives¶
- Chaque accesseur nomme d'où vient la donnée (charte §3 : refuser la magie
cachée ; §11 : une seule façon claire).request.query("name")et
request.route("id")se lisent sans connaître de convention implicite. - Symétrie de la famille restaurée, sans collision avec
request.path.
Limites / Risques¶
- Rupture de l'API publique du core : tout appel
request.param(...)/
request.route_param(...)doit être migré (aucun alias). - Les attributs internes
self.params(dict query) etself.route_params
(dict chemin), ainsi que les clés"params"/"route_params"de
request.data(visibles viaResponse.debug), restent inchangés : hors
périmètre de ce renommage de méthodes.
Alternatives écartées¶
A : query_param / path_param¶
Terminologie HTTP standard et symétrique, mais suffixée alors que le reste de la
famille est nu (form, json, header, file). Plus verbeuse sans gain de
clarté décisif. query / route est plus léger et cohérent avec le vocabulaire
Forge.
B : query / path¶
Le plus court, mais path entre en collision avec l'attribut existant
request.path (la chaîne du chemin). Libérer path() exigerait de renommer cet
attribut conventionnel, rupture plus large et sémantiquement trouble (« path »
le chemin vs « path('id') » un paramètre). Écarté.
C : query / dynamic¶
dynamic est libre et fait écho au starter « dynamic-route », mais il nomme une
caractéristique (le segment est variable), pas une source (le chemin),
contredisant le critère retenu. Écarté.
Hors périmètre de cet ADR¶
- Les attributs
self.params/self.route_paramset les clés de
request.data("params","route_params"). - Les autres accesseurs (
form,json,header,file), déjà conformes.
Référence¶
- Ticket d'implémentation :
HTTP-REQUEST-PARAM-RENAME-001. - Code concerné :
core/http/request.py(query,route), tous les appelants
(starters,docs/starters/welcome-forge/, tests,tests/fake_request.py),
docs/reference/http.md,docs/reference/public-contract-1.0.md. - ADR-003 Convention de langue (API en anglais) :
docs/adr/003-language-convention.md. - Charte :
CHARTE_DOC.md(principes 3, 10, 11).