RESTful API响应数据传输对象

时间:2014-06-18 03:39:19

标签: rest httpresponse dto

我的应用程序中有以下场景。我以用户身份登录,然后创建一个组。有一个REST api用于创建组(POST / groups / api / v1 / groups)并获取组详细信息(GET / groups / api / v1 / groups / {group id})

成功时返回的响应不仅仅是组资源的json表示。它是一个包含许多其他信息的DTO(以避免多次调用服务器)

例如,响应可以包括

  1. 可以对群组执行的操作(例如:邀请用户加入群组)以及需要针对每个操作点击的相应网址

  2. 小组成员人数。

  3. 小组最近的活动

  4. 会员信息

  5. 现在,使用REST api的唯一客户端是需要其他信息的UI。如果以后向开发人员公开API,他们可能不需要返回所有信息。在我们必须返回包含更多信息的DTO的情况下,我们如何处理休息响应?

    在GET的休息响应中返回dto是否是一个好的设计,还是应该避免?

2 个答案:

答案 0 :(得分:3)

如果您接受RESTful HTTP嘈杂的事实,这会有所帮助。噪声的设计补偿是缓存,您应该尽可能多地使用以节省服务器命中。一个良好缓存的应用程序可以使用多个资源,而不是一个大型资源,因为许多请求都不会离开客户端。

就您的具体问题而言,使用expand查询参数来标识要包含的子对象。您可以进一步指定要包含的子项的属性。例如,

GET /groups/api/v1/groups/12345
{
    "id": 12345,
    "name": "The Magnificent Seven",
    "location": {
        "self": "/groups/api/v1/locations/43"
    }
}

GET /groups/api/v1/groups/12345?expand=location
{
    "id": 12345,
    "name": "The Magnificent Seven",
    "location": {
        "self": "/groups/api/v1/locations/43",
        "longitude": "24°01′N",
        "latitude": "104°40′W"
    }
}

GET /groups/api/v1/groups/12345?expand=location[latitude]
{
    "id": 12345,
    "name": "The Magnificent Seven",
    "location": {
        "self": "/groups/api/v1/locations/43",
        "latitude": "104°40′W"
    }
}

答案 1 :(得分:0)

提供超出要求的数据可能会有害,您需要开始向每个人解释为什么要提供如此多的数据。您可以拥有一个对用户子集保密的查询参数,例如" alldetails = true"这将给出完整的DTO。

如果您在REST服务器上使用带codehaus或其他JSON实用程序的Java,则可以使用mixin指定要公开的元素。 codehaus有" addMixInAnnotations()"为此。

GET的良好REST响应应具有JSON或XML中的标识符,必需的详细信息和URL。