我试图找出在REST API上映射几个用例的最佳方法。 我有2个资源/实体:用户和组织
组织包含多个用户(一对多关系)。
我有两种不同的用例:
所以我将第一个映射到GET /api/Organization
在REST标准中映射第二个的通用好方法是什么? 我需要在一个请求中获取所有内容,不能发送新请求以获取每个组织的用户列表,因为性能明智会很糟糕。
我想到了3种不同的可能性:
1)这些内容:GET /api/Organization/customlist/with-users
我真的不喜欢这样,因为它不是真正的REST标准,会与子资源混淆。
2)使用查询参数:GET /api/Organization?getusers=true
这个更干净,但我也不喜欢它,因为我更喜欢保留查询参数仅用于过滤,分页和排序。
3)在GET
正文中使用JSON对象,并对两个用例使用GET /api/Organization
然后根据JSON对象的内容,我知道是否应该获取用户列表。我实际上最喜欢这种方法,因为它允许我对两个请求使用相同的路径,但我知道普遍的共识似乎是在GET请求上使用正文的一个不好的做法,即使最近,对于像ElasticSearch这样的流行项目,这似乎变得更加普遍。
是否有处理类似案件的标准化方法?我可能错过了任何其他方式?当然,我可以将它与其中任何一个一起使用,但是我试图理解对于我认为应该是常见场景的事情的最佳实践。
答案 0 :(得分:1)
我的第一个想法是将组织定义为始终返回用户数据,以保持简单和一致。
假设有一些具体原因这是不可能的,您可能采用的一种方法是针对每种情况使用特定的content types,并允许单个端点支持多种类型 - 所以一种类型可以用来请求"光"没有用户数据的组织表示,另一个请求"完整"包含用户数据的组织规范。
客户端可以使用accept headers指定他们想要的内容类型,并且许多REST实现库支持为给定内容类型指定处理程序
答案 1 :(得分:0)
免责声明:此帖应该是评论而不是答案,但由于格式/尺寸问题,我将其作为答案。
使用选项2.在正确查看查询参数后,您不必维护查询参数供以后使用。我还建议不要使用像getusers=true
这样的QP,但要使用通用qp,例如?includeChild=users; or ?expand=users
。
使用这种方式,您将来可以获得更多孩子/多级主要详细信息关系,例如,如果明天您可能需要在用户下使用地址,那么您可以执行?show(or includeChild)=users,address
等等。您还可以包含通用展开值?show=all
以包含所有子项。
此外,我假设当您“不”包括组织中的“用户”时,您可以通过任何方式提供“用户”链接以响应用户/客户自动向下钻取。像:(伪结构)
{
Organizations:
{
Org1:
{
details..
org1.self link (e.g if anyone just want to fetch one item of organizations) like /organizations/1
org1.child1.link i,e /organizations/1/users
}
}
}
只提供组织详细信息中的子链接,默认情况下,您可以提供指向用户的链接以获取子信息。
这就是更好的休息设计。我假设。
答案 2 :(得分:0)
在REST标准中映射第二个的通用好方法是什么?
REST并不关心你如何拼写你的URI。 REST不关心您使用多少URI。 REST并不关心用于表示域模型中“相同”实体的URI数量。
请记住,在REST架构风格中,大多数URI都是被发现的(而不是书签/永久链接)。
但(实际上)没有人这样做。所以我们按下....
酷URI不会更改 - 您要小心将REST端点与域模型紧密耦合,因为这会增加修改模型的成本。您应该能够改进域实施,而无需更改API。
因此,我建议您为修改域中实体的资源保留部分URI命名空间,并在命名空间的单独部分进行奇特的报告
/model/organization/{organizationid}
vs
/reports/activeOrganizationsDigest?asOf=2016-05-27
/reports/activeOrganizations/showUsers?activeSince=2015-12-12
URI 便宜;不要觉得你需要和他们吝啬。
/userStories?asA=marketingStrategist&iWantTo=reviewCurrentOrganizations&soThat=iCanPlanNewCampaigns
/userStories?asA=emailScammer&iWantTo?mineEmailAddresses&soThat=iCanBroadcastMoreSpam
Ceci n'est pas une pipe
Fielding正在记录的网络成功的一部分是将标识符与表示分离,提供了灵活性,使网络不仅仅是静态文档传输应用程序。
这首歌的名字叫做Haddocks的眼睛......
这首歌的名字是The Aged Aged Man ...
这首歌被称为Ways and Means ......
这首歌是A-sitting on a Gate ...
Charles Lutwidge Dodgson关于decoupling the name from the entity的力量。