我的应用程序中有以下场景。我以用户身份登录,然后创建一个组。有一个REST api用于创建组(POST / groups / api / v1 / groups)并获取组详细信息(GET / groups / api / v1 / groups / {group id})
成功时返回的响应不仅仅是组资源的json表示。它是一个包含许多其他信息的DTO(以避免多次调用服务器)
例如,响应可以包括
可以对群组执行的操作(例如:邀请用户加入群组)以及需要针对每个操作点击的相应网址
小组成员人数。
小组最近的活动
会员信息
等
现在,使用REST api的唯一客户端是需要其他信息的UI。如果以后向开发人员公开API,他们可能不需要返回所有信息。在我们必须返回包含更多信息的DTO的情况下,我们如何处理休息响应?
在GET的休息响应中返回dto是否是一个好的设计,还是应该避免?
答案 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。