【发布时间】:2018-05-09 14:12:27
【问题描述】:
如果标题有点混乱,请多多包涵,我会尽力在下面解释我的问题。
假设我有以下两个端点
-
api/companies(返回如下所有公司的列表)[{name: "company1", id: 1}, {name: "company2", id: 2}] -
api/companies/{companyeId}/employees(返回特定公司的所有员工列表,如下所示)[{name: "employee1", id: 1}, {name: "employee2", id: 2}]
客户端需要的是一份公司名单,每家公司都有一份员工名单。结果应如下所示:
[
{
name: "company1",
id: 1,
employees: [ {name: "employee1", id: 1}, {name: "employee2", id: 2} ]
},
{
name: "company2",
id: 2,
employees: [ {name: "employee3", id: 3}, {name: "employee4", id: 4} ]
},
]
我可以想到两种方法来做到这一点:
- 先获取公司列表,循环遍历公司列表
为每家公司进行 api 调用以获取其员工列表。 (如果我理解正确,我想知道这是否是一种更好的设计方式,因为HATEOAS 原则?因为
api/companies的最小资源单位是公司而不是员工,所以客户应该发现公司作为可用资源但不是员工。)
REST 客户端应该能够动态使用服务器提供的链接来发现它需要的所有可用操作和资源
- 返回每个公司对象内的员工列表,然后通过
api/companies返回公司列表。可能会向此端点添加一个名为responseHasEmployees的查询参数,这是一个布尔默认值为false,因此当用户通过api/companies?responseHasEmployees=true进行GET时,响应正文将在每个公司对象中包含一个员工列表。
所以我的问题是,哪种方式是实现客户端目标的更好方式? (不一定非得是以上两个。)
可能有帮助的额外信息:公司和员工存储在不同的表中,员工表有一个company_fk 列。
【问题讨论】: