web-dev-qa-db-fra.com

Manière de spécifier la liste des champs de ressource dans la demande d'API RESTful

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:

  1. Spécifiez explicitement les champs lits à chaque demande (/ posts? Fileds = subject, author_name et for/posts/42? Fields = subject, body, createaAt, author_name, comments_count, likes_count, etc ...).
  2. Spécifiez explicitement la liste des champs uniquement si elle diffère de la liste des champs par défaut.
  3. Spécifiez la liste des champs à exclure (ou à inclure) de (à) l'ensemble de champs par défaut si l'ensemble de champs souhaité diffère de celui par défaut.

Je dois construire une API claire et utile pour mes clients. Quelle voie dois-je choisir?

31
Ivan Velichko

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.

31
Dan Rowlands

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
    }
  }
}
8
ascrookes