2014-05-19 4 views
1

Il est de pratique courante pour les ressources reposantes de prendre en charge les sélecteurs de champ dans la chaîne de requête. Par exemple, si une ressource a des champs A, B, C et D, mais le client est intéressé uniquement dans un sous-ensemble de champs (disons A et B) l'URL peut ressembler àModélisation des champs calculés dans l'API de repos

.../ressources/1 /? Fields = A, B // seulement A et B sont 'sélectionnés'

Supposons maintenant que nous ajoutons une autre propriété à la ressource. La chose avec cette propriété est qu'elle n'a aucun stockage physique. C'est une valeur calculée. Supposons également que ce calcul est très cher. Reste évidemment que Rest ne se soucie pas de telles choses, que les données proviennent d'un fichier DB ou d'un algorithme de fantaisie.

Mais voici un dilemme: le paramètre de requête 'fields' est toujours facultatif. Dans mon cas, omettre «champs» signifie «amener tous les champs» (un peu comme «*» en SQL):

.../resource/1 // A, B, C, D et E (xpensive) sont 'sélectionnés'

Je suis certain qu'il existe de nombreux clients qui utilisent l'approche naïve (ne prenant pas la peine de spécifier une liste explicite de champs). Cela signifie que l'ajout de cette nouvelle propriété lourde va involontairement créer une rupture de performance (peut-être très sévère).

Quelles sont les techniques courantes pour faire face à ces situations?

Alternatives je considérais:

  1. Ajouter une notion particulière au système qui dit que l'interrogation avec « * » sémantique ne renvoie pas nécessairement tous les champs (champs lourds seront omis par défaut). Si un client les veut, il doit les demander explicitement
  2. Ne pas modéliser ces propriétés supplémentaires en tant que champs sur la ressource. Au lieu d'exposer un point de terminaison dédié qui effectuera le calcul, éliminant ainsi la confusion possible, mais en introduisant le style Rest-RPC dans le système.
  3. Faites le problème du cilent: s'il n'a pas pris la peine d'être explicite en premier lieu, difficile pour lui. Ce n'est pas vraiment une option - ne pas avoir ce privilège.
+0

J'aime 1 meilleur. J'envisagerais de représenter ces champs comme des objets référencés, et ensuite vous pourriez obtenir leur style HATEOAS, à travers des appels séparés pour les champs lourds. Ceci est similaire à la façon dont les pages Web se comportent - retourner le cadre et certains contenus, puis forcer des appels supplémentaires si l'utilisateur veut les images, vidéos, etc –

+1

@EngineerDollery, c'est une approche intéressante. Pouvez-vous me diriger vers des articles/chapitres de livre qui élaborent dessus? Etes-vous au courant des API de repos existantes "célèbres" qui implémentent cette approche?(J'ai déjà regardé facebook et linkedin, pas de chance là-bas). – Vitaliy

+0

Oui, jetez un oeil à ceci: http://spring.io/understanding/HATEOAS, ceci: http://timelessrepo.com/haters-gonna-hateoas, et ceci: http://stackoverflow.com/questions/ tagged/hateoas –

Répondre

1

J'aime l'option 1 mieux. J'envisagerais de représenter ces champs comme des objets référencés, et ensuite vous pourriez obtenir leur style HATEOAS, à travers des appels séparés pour les champs lourds. Cela ressemble au comportement des pages Web - renvoyer le cadre et certains contenus, puis forcer des appels supplémentaires si l'utilisateur veut les images, les vidéos, etc. -

Regardez ceci: spring.io/understanding/ HATEOAS, ceci: timelessrepo.com/haters-gonna-hateoas, et ceci: stackoverflow.com/questions/tagged/hateoas