2010-11-09 6 views
2

J'ai le scénario (hypothétique) suivant:Correct ReST URI design

Demande de rapport sur les étudiants dans les classes dans les écoles. J'ai 3 tables école, classe, étudiant. La classe a un FK school_id et l'étudiant a un FK class_id.

J'ai mes entités toutes configurées et prêtes à l'emploi et je suis sur le point de les exposer via une interface de repos.

Si mes URIs ressembler à ceci: Écoles - Liste des écoles
écoles/{id} - école spécifique
écoles/{id}/cours - liste des classes
écoles/{id}/classes/{id} - classe spécifique
écoles/{id}/classes/{id}/étudiant - étudiants liste
écoles/{id}/classes/{id}/étudiant/{id} - étudiants spécifiques

Même si dans le cas d'un étudiant spécifique, je vais ignorer le je vais ignorer l'id de l'école et l'ID de la classe comme tout ce qui m'importe pour Ma requête est l'identifiant de l'étudiant.

Dois-je avoir: Écoles/étudiant/{id} - pour des étudiants spécifiques.

Répondre

4

Il n'y a aucun problème avec l'exposition d'une ressource à partir de plusieurs emplacements (bien que ce soit une bonne idée de spécifier le canonical url s'il y a plusieurs emplacements *).

Ainsi, il peut être judicieux de fournir toutes les URIs suivantes:

lists: 

student 
classes/{id}/student 
schools/{id}/classes/{id}/student 

specific: 

student/{id} 
classes/{id}/student/{id} 
schools/{id}/classes/{id}/student/{id} 

Dans votre cas, la relation entre les entités ne sont pas une entité elle-même. Si tel était le cas (par exemple, si l'étudiant de la classe de ressources possédait un attribut spécifiant depuis combien de temps l'étudiant était dans la classe), les identificateurs URI contenant les identifiants class et student deviennent plus importants car ils fournissent un bon emplacement pour exposer les attributs de la relation elle-même. * Pour fournir au mieux l'URL canonique au client, vous pouvez l'envoyer comme valeur du "Content-Location" dans les en-têtes de réponse.

+0

Pour la section des listes, la valeur de la liste des étudiants serait-elle une liste d'URI faisant référence à l'emplacement canonique de chaque étudiant spécifique dans la liste? – ScottCher

+1

+1 en raison de la référence à l'ajout de l'URL canonique à l'emplacement du contenu. Bon conseil. – ScottCher

+0

@ ScottCher, je ne pense pas que ce soit important, mais personnellement, dans le contenu de la page, j'utiliserais des liens qui ajoutent simplement l'identifiant de l'étudiant à l'URL actuelle. De cette façon, le contexte de l'URL sert de simple fonctionnalité "fil d'Ariane". –

1

En outre, il est utile d'avoir une convention pour utiliser des noms pluriels/singuliers. Certaines personnes aiment seulement les noms singuliers, certains (comme les gens de Ruby) utilisant les deux et un outil de conversion. Par exemple, dans la réponse de Ian student, l'URL de la liste doit être students.

+0

Je suis d'accord que c'est important - mais aussi une source de controverse! Je préfère le singulier partout pour les ressources parce que je travaille dans des environnements multilingues et les pluriels dans d'autres langues peuvent être beaucoup plus complexes qu'en anglais, mais dans ma réponse je suis les exemples dans la question. –

+0

J'utilise toujours aussi singulier :) –

+0

Intéressant, je préférerais le pluriel partout où le résultat pourrait être une collection (0-plusieurs). alors/classes/{id}/students fait plus d'envoi et/classes/{id}/students {id}. Je comprends ce que vous dites à propos des environnements controversés et multilingues.Qu'est-ce que c'est que de dire que les normes sont magiques parce qu'il y en a tellement? 8) – ScottCher