在RESTful Web服务中,Response DTO是否应包含其子DTO?

时间:2012-05-01 20:02:18

标签: json web-services rest dto saas

考虑一个具有名称和多个位置(/ users / {id} / locations)的用户(/ users / {id})。

当我请求用户(/ user / {id})时,该用户是否应该完全代表 - 其ID,名称和位置 - 还是应该仅在单独的请求中返回位置?例如,您对id = 123(/ users / 123)的用户的请求期望哪个JSON DTO:

1){" id":123," name":" Peter"," locations":[{" id":1," name":" Chicago"},{" id":2," name":&#34 ;纽约"}]}

2){" id":123," name":" Peter"," locations":[{" id":1},{" id":2}]}

3){" id":123," name":" Peter"," locations":[1,2]}

4){" id":123," name":" Peter" }

这是否更主观,推动和拉动DTO的大小和典型用例中所需的请求?我倾向于简单地包含所有相关数据(1),但我不确定这比仅仅要求开发人员多次调用API以获取 all <更好< / em>他们实际想要的数据。

3 个答案:

答案 0 :(得分:3)

要成为RESTful,您不一定要返回资源的完整表示 但是,您希望启用超媒体作为获取/设置API用户所需的所有信息的手段(超媒体作为应用程序状态的引擎 - a.k.a。HATEOAS

为了满足这一点,您可以使用@bowmanb的建议为所有位置放置URI,或为每个位置添加单独的URI。您可能希望为使用该资源执行某些操作的其他选项添加其他URI。

有一篇关于HATEOAS的好文章,Jim Webber,Savas Parastatidis&amp;伊恩·罗宾逊打电话给"how to GET a cup of coffee"

答案 1 :(得分:2)

我是这个世界的新手,但我正在建立一个宁静的api并面对完全相同的问题。我最初的工作是包括所有内容 - 所以我的结果看起来像你的选择(1)。事实上,我更进一步,并在每个对象中包含一个URI,这样理论上,响应可以由足够智能的客户端导航。

话虽如此,我发现我的“用户”对象的一个​​特定属性是巨大的。它似乎不会影响性能,但在我看来,没有客户端会想要有关该特定属性的所有信息 - 大多数客户端只需要id和name。所以,我将修改该属性的默认方法。

底线 - 在我的新手意见中 - 是决定是由客户的预期用途驱动 - 客户希望看到什么?

答案 2 :(得分:1)

客户应该有一些方法来确定如何查找用户的位置。所以我会排除第4位。

如果您担心响应的大小,我认为仅将URI包含在用户的位置仍然是RESTful:

{ "id":123, "name":"Peter", "locations":"/users/123/locations" }