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?
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:
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.