Aller au contenu principal

Convention de nommage

doitAppliquer comme convention de nommage :

Les contraintes techniques des frameworks ou stacks mis en oeuvre sont souvent utilisées à tort comme argument pour décider de choisir la convention snake_case plutôt que kebab-case.

Bien que ce débat ne soit pas véritablement tranché, le fait est que la majorité des solutions de blogs (sensibles par définition aux optimisations SEO et aux standards du web) ont opté pour kebab-case (appelé aussi "hyphen-separated-case").

doitLes noms d'attributs doivent toujours respecter un encodage ASCII, avec comme premier caractère une lettre, $, ou \_ (pas de chiffre), chaque caractère suivant peut être une lettre, $, \_ ou un chiffre.

URLs et actions

Les URLs et actions d'une API représentent la carte qui permet de naviguer dans le SI.

Une API est organisée en ressources logiques localisées par leur URI et manipulées par un verbe, verbe représenté par une méthode HTTP (GET, POST, PUT, PATCH, DELETE).

Ces principes forts du style d'architecture REST ont été introduits par Roy Fielding dans sa thèse sur les architectures logicielles basées sur les réseaux, plus précisément au chapitre 5.

doitChoisir la bonne méthode pour la bonne action :
MéthodeActionSituationRemarques
GETlister, obtenirobtenir la représentation d'une ressourcele SI n'est pas modifié (idempotence)
POSTajouterajouter un élément dans une collection de ressourcesle SI est modifié et souvent un identifiant est généré pour la nouvelle ressource créée (et communiqué via l'en-tête Location)
PUTmodifier complètementremplacer une ressourcele payload soumis est censé représenter complètement la ressource, c'est-à-dire que la ressource peut être écrasée par les données envoyées
PATCHmodifier partiellementmettre à jour une ressource partiellementles données composantes de la ressource existante et non présentes dans le payload restent inchangées
DELETEsupprimer, purgersupprimer, détruire une ressource, ou vider une collection de ressourcesclassiquement la réponse ne contient pas de corps et le statut est 204
HEADvérifiervérifier l'obtention d'une ressource, obtenir des méta donnéesaucun corps / aucune représentation n'est retournée dans la réponse; rarement utilisée, cette méthode peut servir à vérifier la localisation d'une ressource
OPTIONSse renseignerobtenir des informations sur les modalités de la communicationpermet au client d'en savoir plus sur les prérequis d'une ressource; très rarement implémenté

Il est à noter que la méthode POST est parfois utilisée comme méthode de remplacement de PUT, PATCH ou DELETE, dans des situations d'exceptions comme un client ne supportant pas toutes les méthodes (navigateur obsolète).

Dans une telle situation, on utilise la méthode POST en précisant la "vraie" méthode dans un en-tête "X-HTTP-Method-Override" ou un paramètre de requête "_method"; la plupart des frameworks pour applications web sont censés supporter ce fallback.

Le fait qu'un service web propose cette souplesse de fonctionnement ne l'affranchit absolument pas de respecter le standard, les deux modes n'étant pas exclusifs.

Nommage d'une ressource (URI)

doitUne ressource doit représenter un nom commun ("noun"), de préférence en anglais car la localisation d'une ressource ne doit pas préjuger de la langue de préférence du consommateur (l'anglais étant le choix le plus générique possible).

La sémantique est la chose la plus importante à avoir en tête pour obtenir un bon nommage.

Exemples :

RessourceNom
Une pizzapizza
Un clientcustomer
Le client 3customer?id=3
Le client 3customers/3
L'adresse du client 4customers/4/address
L'email 3 de l'utilisateur 2users/2/emails/3

Dans certaines situations exceptionnelles, où il paraît délicat de respecter ce principe, on utilise une forme RPC, néanmoins cela reste une enfreinte aux bonnes pratiques.

Concrètement lorsque l'on est résigné à choisir un style RPC, on utilise un verbe plutôt qu'un nom commun; le verbe désignant explicitement une action.

Exemples RPC :

RessourceNom
S'enregistrersignup
Se connectersignin
Supprimer une page des favorispages/4/unstar

Sémantique

Pour nommer efficacement une ressource, utiliser des moyens mnémotechniques simples en prononçant mentalement des phrases adaptées au besoin.

Exemples :

BesoinTraduction sémantiqueNommage résultant
Obtenir l'adresse de l'utilisateur 7Obtenir l'adresse de l'élément 7 de la collection des utilisateursGET /customers/7/address
Obtenir la facture de mon compte...GET /account/invoice
Créer un clientPoster un élément dans la collection des clientsPOST /customers

Conseil : consacrez tout le temps nécessaire à la définition d'une bonne sémantique, vous ne le regrettez pas.

Pluriel

Dans la plupart des cas, les ressources à concevoir désignent une collection permettant d'ajouter ou de supprimer des éléments.

La collection désigne alors naturellement un pluriel, tandis que l'élément désigne un singulier.

Néanmoins, un élément peut être vu comme un sous-ensemble d'une collection, sa localisation se résumant alors à un sous-chemin par rapport à la collection (un singulier n'est qu'un item d'un pluriel).

devraitAfin de rendre les chemins de ressources consistants et intuitifs, on privilégie l'utilisation du pluriel plutôt que le singulier.

Exemple appliqué à CRUD :

BesoinRessource
Obtenir les pizzasGET /pizzas
Créer une pizzaPOST /pizzas
Obtenir la pizza carbonaraGET /pizzas/carbonara
Modifier la pizza carbonaraPUT /pizzas/carbonara
Supprimer la pizza carbonaraDELETE /pizzas/carbonara

Par extension, une requête DELETE /pizzas correspondrait à "purger toutes les pizzas" (rarement implémenté)