Home
Quelques conseils repris du livre Build APIs You Won’t Hate.
Un chouette livre à parcourir, mais pour ceux qui ont déjà un peu d’expérience dans la construction d’APIs (= pas moi). Il fera gagner du temps sur certains points, et évitera de prendre de mauvaises décisions, qui pourraient avoir un impact à plus long terme. Par exemple:
/places/1
ou /places/1,2
. Cela permet de conserver une cohérence globale.checkin[place_id]=1&checkin[message]=This is a bunch of text&checkin[with_friends]=1...
.Soit on envoie tout dans une structure pluralisée (même s’il n’y a qu’un seul résultat):
{
"posts": [{
"id": 1,
"title": "Zen of Python"
}]
}
Soit on envoie le résultat concerné par la réponse (un objet ou une liste d’objets) - c’est l’approche minimaliste conseillée par Twitter:
// Un seul objet en retour -> pas d'encapsulation dans une liste
{
"name": "Hulk Hogan",
"id": "10002"
}
// Plusieurs objets -> encapsulés dans une liste
[
{
"name": "Hulk Hogan",
"id": "10002"
},
{
"name": "Mick Foley",
"id": "10003"
}
]
Soit on embarque les collections dans une propriété data
(Facebook-style):
// Un seul objet en retour -> pas d'encapsulation dans une liste
{
"name": "Hulk Hogan",
"id": "10002"
}
// Plusieurs objets -> On crée une collection dans un attribut `data`
{
"data": [
{
"name": "Hulk Hogan",
"id": "10002"
},
{
"name": "Mick Foley",
"id": "10003"
}
]
}
Soit on ajoute par défaut un namespace sur le résultat de retour:
{
"data": {
"name": "Hulk Hogan",
"id": "10002"
}
}
{
"data": [
{
"name": "Hulk Hogan",
"id": "10002"
},
{
"name": "Mick Foley",
"id": "10003"
}
]
}
L’avantage de cette dernière proposition est que chaque résultat est wrappé dans une propriété data
(même les sous-propriétés). En gros, on devrait pouvoir faire profiter de pagination, des liens, … à n’importe quel niveau de l’API.
Voir aussi JSON-API.
En plus des tests unitaires, on peut envisager du BDD - Behavior Driven Development - notamment avec Cucumber.