Search code examples
jsonrestapi-design

REST api design to retrieve summary information


I have a scenario in which I have REST API which manages a Resource which we will call Group. A Group is similar in concept to a discussion forum in Google Groups.

Now I have two GET access method which I believe needs separate representations.

The 1st GET access method retrieves the minimal amount of information about a Group. Given a group_id it should return a minimal amount of information like

{ 
    group_id: "5t7yu8i9io0op",
    group_name: "Android Developers",
    is_moderated: true,
    number_of_users: 34,
    new_messages: 5,
    icon: "http://boo.com/pic.png"
}

The 2nd GET access method retrives summary information which are more statistical in nature like:

{ 
    group_id: "5t7yu8i9io0op",
    top_ranking_users: {
      [ { user: "george", posts: 789, rank: 1 }, 
        { user: "joel", posts: 560, rank: 2 }  ...]
    },
    popular_topics: {
      [ ... ]
    }
}

I want to separate these data access methods and I'm currently planning on this design:

GET /group/:group_id/
GET /group/:group_id/stat

Only the latter will return the statistical information about the group. What do you think about this ?


Solution

  • I don't see a problem with your approach. Since the statistics are basically separate data, you could treat the stats as a separate resource, too, providing a URI like

    GET /stat/:group_id
    

    Additionally you can cross reference your resources (meaning a group links to the corresponding stat resource and vice versa):

    GET /group/5t7yu8i9io0op
    
    { 
        group_id: "5t7yu8i9io0op",
        group_name: "Android Developers",
        is_moderated: true,
        number_of_users: 34,
        new_messages: 5,
        icon: "http://boo.com/pic.png",
        stats: "http://mydomain.com/stat/5t7yu8i9io0op"
    }
    
    GET /stat/5t7yu8i9io0op
    
    { 
        group: "http://mydomain.com/group/5t7yu8i9io0op",
        top_ranking_users: {
          [ { user: "george", posts: 789, rank: 1 }, 
            { user: "joel", posts: 560, rank: 2 }  ...]
        },
        popular_topics: {
          [ ... ]
        }
    }