Dans REST, il est normal d'avoir plusieurs ressources qui partagent les mêmes représentations.
Par exemple, la "version préférée des auteurs" d'un article universitaire est un mappage dont la valeur évolue dans le temps, alors qu'un mappage vers "l'article publié dans les actes de la conférence X" est statique. Il s'agit de deux ressources distinctes, même si elles correspondent toutes deux à la même valeur à un moment donné. Cette distinction est nécessaire pour que les deux ressources puissent être identifiées et référencées indépendamment. Un exemple similaire dans le domaine de l'ingénierie logicielle est l'identification séparée d'un fichier de code source contrôlé par version lorsqu'on se réfère à la "dernière révision", au "numéro de révision 1.2.7" ou à la "révision incluse dans la version Orange". -- Fielding, 2000
Il est parfaitement cohérent avec cette approche d'avoir une ressource pour "tous les utilisateurs", et une autre pour "les utilisateurs créés par Bob".
Là où les choses se compliquent, c'est dans le cas où l'on veut utiliser la fonction même pour fournir des représentations différentes. En d'autres termes, lorsque Alice regarde "users created by me", elle voit "users created by Alice", et lorsque Bob regarde "users created by me", il voit "users created by Bob".
Une possibilité est de faire en sorte que les "utilisateurs créés par moi" redirigent vers la ressource appropriée. Cela fonctionne, pour les valeurs de "fonctionne" qui permettent des allers-retours supplémentaires lorsque la ressource de destination n'est pas déjà dans le cache local.
Dans HTTP/2, le push serveur peut vous épargner une partie de ces allers-retours.
Les règles pour caches partagés devrait vous protéger contre l'envoi de la vue d'Alice de la ressource "moi" à Bob, et vice versa, mais il est utile de connaître la signification des différents en-têtes afin de ne pas désactiver cette protection par inadvertance.
Le fait d'avoir des ressources différentes peut poser un problème dans certains contextes de "lecture de ses propres écritures", car les caches ne sauront pas qu'une requête non sécurisée a invalidé les données de l'utilisateur. les deux ressources. Bob crée un nouvel utilisateur via un POST vers "users created by me", et l'entrée de cache correspondante est invalidée... mais "all users" est une clé de cache différente, et n'est pas invalidée. Donc si Bob regarde la vue "all users", il peut voir une copie précédemment mise en cache sans les changements qu'il vient de voir dans sa propre vue.
Dans certains cas, il peut être judicieux d'envisager des sous-ressources.
/api/customers
/api/customers#created-by-Alice
/api/customers#created-by-Bob
Mais si vous essayez de réduire la quantité de données non pertinentes échangées, ce n'est pas une bonne solution.