考虑一个具有名称和多个位置(/ 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>他们实际想要的数据。
答案 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" }