So I've been reading a lot on RESTfull design - specifically dealing with resources.
Taking the canonical example of Users, Posts, and Comments, with relationships as:
Users ---(hasMany)---> Post ---(hasMany)---> Comment
One may initially think to expose something like:
GET /users GET /posts GET /comments POST /users POST /posts POST /comments GET /users/id GET /posts/id GET /comments/id PUT /users/id PUT /posts/id PUT /comments/id DELETE /users/id DELETE /posts/id DELETE /comments/id
But then, say I want all Comments of a certain Post made by a particular User. I'd need to do something like:
GET /users/id > someUser > var postIds = someUser.posts() GET /posts?id=<postIds>&id=<postIds>&... > somePosts > **application user inspects posts to see which one they care about** > var postOfInterest = somePosts[x]; > var postId = postOfInterest.id; GET /comments?id=postId > someComments (finally)
Suppose though I only care about a Post or Comment in the context of it's owner. Suppose a different resource structuring which may (or may not?) be more natural:
GET /users POST /users GET /users/id PUT /users/id DELETE /users/id GET /users/id/posts POST /users/id/posts GET /users/id/posts/id PUT /users/id/posts/id DELETE /users/id/posts/id GET /users/id/posts/id/comments POST /users/id/posts/id/comments GET /users/id/posts/id/comments/id GET /users/id/posts/id/comments/id GET /users/id/posts/id/comments/id
Which to me, is probably a better representation of what the resources are. Then all I need is:
GET /users/id/posts > somePosts > **application user inspects posts to see which one they care about** > var postOfInterest = somePosts[x]; > var postId = postOfInterest.id; GET /users/id/posts/postId/comments > someComments
This just seems more like navigating a file system than the previous method - but I don't know if its RESTfull at all (perhaps this is what REST was trying to get rid of) because in order to access a Comments resource, I need to know which User and which Post it belongs to. But the former requires 3 requests, while the latter requires just 2.