Comment dois-je traiter avec les hiérarchies de supports dans une API RESTful?

Je suis actuellement à la conception de l'API pour une application en PHP, et, à cette fin étudie RESTE raisonnable approche architecturale.

Je crois que j'ai une assez bonne compréhension des concepts clés, mais j'ai du mal à trouver quelqu'un qui a abordé les hiérarchies de supports et de REPOS.

Voici le problème...

Dans la [demande] l'entreprise objet de la hiérarchie, nous avons:

Users 
 L which have one-to-many Channel objects
 L which have one-to-many Member objects

Dans l'application elle-même, nous utilisons un lazy load approche pour remplir l'objet de l'Utilisateur avec les tableaux de ces objets en tant que de besoin. Je crois OO termes c'est l'objet de l'agrégation, mais j'ai vu plusieurs de nommage des incohérences et ne se soucient pas de se lancer dans une guerre sur la convention de nommage .

Pour l'instant, considérez que j'ai quelques faiblement couplées, les objets que je peut /ne peut pas remplir en fonction de l'application a besoin.

À partir d'un RESTE point de vue, je suis en train d'essayer de déterminer ce que l'approche devrait être. Voici ma pensée actuelle (compte tenu d'OBTENIR seulement pour le moment):

Option 1 - remplir entièrement les objets:

GET api.example.com/user/{user_id}

Lu l'Utilisateur de l'objet (des ressources) et de retour de l'objet Utilisateur avec tous les Canaux et Membre des objets pré-chargé et codé (JSON ou XML).

POUR: réduire le nombre d'objets, pas de traversée de hiérarchies d'objets requis

INCONVÉNIENTS: les objets doivent être entièrement rempli (cher)

Option 2 - remplir l'objet primaire et inclure des liens vers d'autres objets de ressources:

GET api.example.com/user/{user_id}

Lu l'Utilisateur de l'objet (des ressources) et le retour de l'objet Utilisateur données Utilisateur peuplée et deux listes.

Chaque liste de références appropriées (sous -) c'est à dire des ressources

api.example.com/channel/{channel_id}
api.example.com/member/{member_id}

Je pense que c'est près de (ou exactement) les implications de l'hypermédia, le client peut obtenir les autres ressources si l'on veut (tant que je les marquer sagement).

PROS: le client peut choisir de charger les subordonnés ou autrement, une meilleure séparation des objets comme les autres ressources

INCONVÉNIENTS: davantage de voyage requis pour obtenir les ressources secondaires

Option 3 - activer récursive récupère

GET api.example.com/user/{user_id}

Lire l'objet Utilisateur et inclure des liens vers des listes de sous-objets, c'est à dire

api.example.com/user/{user_id}/channels
api.example.com/user/{user_id}/members

la /les canaux d'appel de renvoyer une liste de canaliser les ressources dans la forme (comme ci-dessus):

api.example.com/channel/{channel_id}

PROS: ressources primaires exposer où aller pour obtenir de l'subodinates mais pas ce qu'ils sont (plus Reposant?), aucune exigence pour obtenir les subordonnés à l'avant, le subordonné liste des générateurs (et/ou les canaux et /membres) fournissent des interfaces (méthode) rendant la réponse plus type de service.

INCONVÉNIENTS: trois appels à maintenant nécessaire pour remplir entièrement l'objet

Option 4 - (re)considérer l'objet de la conception pour le REPOS

Je suis re-à l'aide de la [existant] objet de l'application de la hiérarchie et en essayant de l'appliquer au REPOS - ou peut-être plus directement, de fournir une API d'interface.

Peut-être le RESTE de la hiérarchie objet doit être différent, ou peut-être la nouvelle Reposante de la pensée est d'exposer les limites de l'objet existant conception.

Toute réflexion sur le dessus de bienvenue.

Merci beaucoup

Paul

InformationsquelleAutor paulkmoore | 2010-10-05