J'ai une API RESTful au sein d'un service Web avec une sorte de ressources comme les utilisateurs, les publications, etc. Lorsque je fais une demande de liste de publications (GET/publications), je souhaite récupérer un tableau de publications uniquement avec une partie réduite des données pour chaque publication (c'est-à-dire le sujet, le nom de l'auteur). Lorsque je fais une demande de publication concrète (GET/posts/42), je souhaite récupérer la liste complète des champs d'objet de publication, y compris le grand corps du message, des informations supplémentaires sur le nombre de likes, le nombre de commentaires. Je suppose qu'il existe de nombreuses façons de résoudre ce problème. Dans mon esprit, les 3 plus évidents sont:
Je dois construire une API claire et utile pour mes clients. Quelle voie dois-je choisir?
J'irais pour l'option 2 à mon humble avis.
Donc, si le consommateur demande simplement l'url de la ressource (/posts/42
) ils reçoivent les champs par défaut.
Les consommateurs peuvent ensuite modifier la réponse par défaut en définissant des valeurs dans la chaîne de requête comme:
/posts/42/fields?subject,author_name
Cela a bien fonctionné pour moi dans le passé et c'est ainsi que fonctionnent d'autres API bien connues, par exemple Facebook
Modifier : En y repensant, je changerais la demande comme suit:
/posts/42?fields=subject,author_name
/post/42
est la ressource, pas les champs.
Ont également fait des recherches dans ce domaine et ont été orientés vers GraphQL de Facebook comme une alternative à la demande d'une API reposante avec les champs souhaités. Il en est encore à ses débuts mais semble très prometteur.
https://facebook.github.io/react/blog/2015/05/01/graphql-introduction.html
EDIT: Reproduit de l'URL:
Une requête GraphQL est une chaîne interprétée par un serveur qui renvoie des données dans un format spécifié. Voici un exemple de requête:
{
user(id: 3500401) {
id,
name,
isViewerFriend,
profilePicture(size: 50) {
uri,
width,
height
}
}
}
(Remarque: cette syntaxe est légèrement différente des exemples GraphQL précédents. Nous avons récemment apporté des améliorations au langage.)
Et voici la réponse à cette requête.
{
"user" : {
"id": 3500401,
"name": "Jing Chen",
"isViewerFriend": true,
"profilePicture": {
"uri": "http://someurl.cdn/pic.jpg",
"width": 50,
"height": 50
}
}
}