REST API设计 - 处理字段间依赖性

时间:2015-02-26 05:58:26

标签: api rest api-design

我有一个名为User的资源,其中包含以下字段:idlast_namedate_of_birthorganization_idemployee_number

我想定义一个搜索终点,允许人们检索满足某些条件的用户。对于例如last_name是"约翰"以及在某个约会后出生的人。为此,我可以使用通用/user/search端点,将这些条件视为GET参数。

但是,某些查询存在某些业务规则。对于例如除非伴随employee_number字段,否则无法查询organization_id。我发现在丑陋的文档中提到这一点。我该如何以更优雅的方式强制执行此操作?

我的一个想法是拥有/user/employee_number/:number个终点,将organization_id作为强制GET参数。但这似乎并没有#REST; REST" ful。还有其他建议吗?

1 个答案:

答案 0 :(得分:0)

首先,请注意,URI并不能确定" RESTfulness"。它们是任意标识符。话虽如此,我们通常需要很好的URI。

以下是要考虑的选项的非详尽列表。

选项1. Hiearchical。一个选项:如果每个员工都依赖于组织那么你可以拥有

/organization/:org/employee/:number

足够干净,但员工/用户是重要资源,因此您可能不希望它们作为二级资源存在。很公平。

更严重的反对意见是,这会将用户与特定组织联系起来。在现实生活中,人们会从组织到组织,然后我们通常不会想到这会导致身份的变化。实际上,通过这种方法,资源是用户在给定组织中的就业,而不是作为用户他/她自己。

选项2. Matrix params。如果您希望/ employee或/ user成为顶级,那么另一个选项就是所谓的matrix params

/user;org=:org;number=:number

这些不是官方的,但自蒂姆伯纳斯 - 李提出这个想法以来,人们将其视为半官方声明。 (我认为它们看起来很丑陋,但这只是一种纯粹的审美判断;它与RESTfulness没有任何关系。)

这与关于员工四处走动的选项#1存在同样的问题。

选项3.数据库ID。第三个选项:

/user/:id

其中:id只是一些数据库标识符。将搜索记录为需要org +员工编号,以保证唯一性。它不一定非常丑陋......例如HAL spec有一个很好的基于CURIE的文档方案。

URI再次只是一个任意标识符,所以使用DB ID就可以了。基本上人们必须通过组织,员工编号等查询员工,但员工的self链接将返回包含数据库ID的URI。

很好,很干净,但是客户端无法直接构建URI,这恰好符合基础REST的HATEOAS /超媒体理念:API中的少量入口点,以及客户端导航(即使用资源中嵌入的链接来影响应用程序状态转换。

此外,这允许用户从组织移动到组织而不必承担新的身份。