web-dev-qa-db-fra.com

Concevoir A REST Ressource API avec un identifiant non unique, mais un identifiant composite unique

Est-ce mauvais pour A REST API d'avoir une identification non unique pour une ressource pour enfants?

Par exemple, le point final est:

GET /parent/:parent_name/child/:child_name

Les :parent_name est unique, mais un :child_name n'est unique unique pour ce parent.

J'ai décidé d'utiliser des noms au début parce que le parent et child sont des ressources existantes dans des systèmes externes. Cela permettrait aux consommateurs de l'API de saisir les noms dans l'URI intuitivement sans nécessiter une requête supplémentaire pour obtenir un identifiant unique à l'API comme un GUID.

Cependant, je commence à penser que cela aurait pu être une erreur. Tous les points de terminaison qui utilisent un child ont maintenant besoin de la fois le :parent_name et :child_name. Tous les points de terminaison où le child est la racine nécessite également la :parent_name Dans un paramètre de requête, qui me donne un mauvais sentiment et je ne suis pas sûr de la manière dont il est intuitif pour les consommateurs d'API.

Est-ce que cette conception avec des identifiants non uniques pour les ressources enfants est acceptable, ou est-il préférable de générer un identifiant unique au sein de l'API et d'utiliser toujours cet identifiant?

3
peefartpoop

Il n'y a pas de règles difficiles pour la manière de construire des URL au repos, uniquement du sens commun et des meilleures pratiques (ici est par exemple ne ce guide, hors de nombreuses). De A REST point de vue, ce n'est pas important à quoi ressemblent les URL. Quelque chose comme /da39a3ee5e6b4b0d3255b est tout simplement bien tant qu'elle identifie une ressource.

Dans votre cas, toute l'URL est l'identifiant de ressource à un point particulier (soit celui d'une collection d'entités ou d'une seule entité). Donc, si vous pouvez construire correctement les URL de manière à ce qu'il n'y ait pas de chevauchements pouvant potentiellement faire valoir un identifiant sur plus de ressources, vous devez être bien, peu importe la manière dont vous construisez les URL et les noms qu'ils contiennent.

Avec cet étant dit, il y a cependant des problèmes si vous décidez d'utiliser des noms (vous ne mentionnez pas exactement ce que ces noms contiennent donc, je suppose donc du texte brut). Comme je l'ai mentionné, REST ne se soucie pas des URL. Nous construisons des URL conviviales. Nous construisons des URL conviviales comme celle des utilisateurs. Les utilisateurs de personnes. Une machine ne se soucie pas. Alors, considérez les gens comme votre public cible si Vous souhaitez construire des URL avec des noms dans eux au lieu d'identifiants. Par exemple, du sommet de ma tête:

  • les gens peuvent-ils être confondus quand ils voient le même nom enfant dans différents endroits?
  • ces noms sont-ils créés en fonction de certaines règles ou d'écriture gratuite? Si quelqu'un orthographique un nom, une URL est créée avec ce nom. Ils découvrent leur faute de frappe et ils le fixent ensuite. Maintenant, vous obtenez une autre URL avec le nom correct qui pointe vers la même ressource. Comment allez-vous gérer cela? Réécrire les règles sur le serveur? Comment invalider vos caches? etc.
  • internationalisation? Si les gens veulent des traductions, vous obtenez le même nom en N langues différentes. Que se passe-t-il alors?
  • les gens peuvent-ils se référer aux entités d'enfants et les gérer comme des entités autonomes? Fondamentalement, ce que vous dites aussi dans votre message, que maintenant les gens ont besoin de penser à un nom d'entité et de les associer toujours avec leur parent.
  • codage? Quoi sont exactement ces noms? Pouvez-vous les gâcher entre UTF-8 et ASCII par exemple?
  • noms minuscules VS Noms de majuscules? Sont-ils des noms différents ou la même chose?
  • etc.

Pour des raisons telles que ces personnes préfèrent généralement coller un identifiant là-bas et l'appeler une journée. Parfois ils utilisent même :ID-:Name (I.e. Identifiant, Dash, Nom) ou :ID/:Name (i.e. id, slash, nom). L'ID est utilisé par l'application alors que le nom est là pour la commodité des personnes et est ignoré par le moteur d'exécution/routage réel de l'application. Voir comme exemple ce poste réel et comparez ces deux URL:

Concevoir A REST Ressource API avec un identifiant non unique, mais un identifiant composite unique

Concevoir A REST Ressource API avec un identifiant non unique, mais un identifiant composite unique

L'application regarde l'identifiant de la poste, qu'est-ce qui se trouve pour les personnes et le référencement.

Pour conclure, il n'y a pas de réponse définitive à cette question. Comme je l'ai dit, juste du bon sens et des meilleures pratiques. Alors, utilisez le bon sens et lisez quelques meilleures pratiques. Ma réponse personnelle à cela serait d'essayer d'éviter les noms en raison des problèmes que j'ai mentionnés ci-dessus. Vous pouvez faire un gâchis avec des noms, mais moins avec des ID (généralement numériques). Et votre API sera plus facile à évoluer avec des identifiants au lieu de noms.

5
Bogdan