Concevoir des APIs HTTP dans Rails que votre équipe frontend appréciera vraiment
La plupart des plaintes sur les APIs concernent l'incohérence, pas les fonctionnalités manquantes. La cohérence est le véritable livrable de la conception d'API.
Publié le 6 février 2022 · 4 min de lecture
La plupart des plaintes des équipes frontend sur les APIs ne portent pas sur des fonctionnalités manquantes, mais sur l'incohérence : un endpoint renvoie les dates en chaînes ISO, un autre en timestamps Unix, et les erreurs reviennent sous trois formes différentes selon le contrôleur qui les a levées. La cohérence est le véritable livrable de la conception d'API.
Choisir une forme d'erreur une fois, l'appliquer partout
Un format d'erreur unique et prévisible permet au frontend d'écrire un seul gestionnaire d'erreurs au lieu d'un par endpoint.
rescue_from ActiveRecord::RecordInvalid do |e|
render json: {
error: { code: "validation_failed", message: e.message, fields: e.record.errors.as_json }
}, status: :unprocessable_entity
end
Sérialiser explicitement, ne pas exposer le modèle
Rendre directement un objet ActiveRecord expose chaque colonne, y compris celles ajoutées le trimestre prochain pour une raison sans rapport. Un serializer dédié fait de la forme de la réponse un contrat délibéré plutôt qu'un accident du schéma.
Versionner dès le premier jour, même pour l'API interne d'un monolithe
Ajouter un préfixe de version aux routes ne coûte rien quand il n'y a qu'un seul consommateur. L'ajouter après coup, alors que trois intégrations externes dépendent déjà du chemin non versionné, coûte un plan de migration et une fenêtre de dépréciation. Nous ajoutons le préfixe même sur des APIs dont nous sommes certains qu'elles n'auront jamais qu'un seul client, parce que cette certitude se révèle généralement fausse en moins d'un an.
La pagination et le filtrage font partie du contrat, ils ne sont pas un détail
Un endpoint qui renvoie tous les enregistrements « pour l'instant » devient un incident de production le jour où cette table dépasse quelques centaines de milliers de lignes. Une pagination par curseur, documentée dès la première version, évite à la fois la chute de performance et le breaking change que représente l'ajout tardif d'une pagination à un client qui supposait un tableau simple.
Rien de tout cela ne consiste à suivre une spécification pour elle-même. Il s'agit de faire de l'API quelque chose sur lequel une équipe frontend peut construire sans avoir à lire le code source Rails pour deviner ce qui se passera ensuite.
Articles liés
Événements et commandes : démêler l'architecture orientée événements dans un système Rails
Deux contrats très différents se cachent derrière l'étiquette « orienté événements ». Bien choisir les noms détermine le comportement du reste de l'architecture.
Concevoir une architecture de services Rails autour de SEPA et des flux de paiement
Les paiements changent les questions de conception auxquelles une codebase Rails doit répondre. Notes sur l'isolation des mouvements d'argent, les ledgers, et la modélisation de SEPA comme le processus asynchrone qu'il est.