【发布时间】:2017-08-18 12:43:57
【问题描述】:
我必须设计一个 API 来管理一个 Document 实体:这个实体的独创性在于它可以有两个不同的 id:
- id1(数字,即1234)
- id2(数字,即89)
对于每个文档,只有一个 id 可用(id1 或 id2,不能同时使用)
通常我通过使用查询参数来执行某种“搜索”功能来解决这个问题:
GET /documents?id1=1234
GET /documents?id2=89
但只有在没有子实体的情况下才有效...
假设我想获取文档的作者:
GET /documents/1234/authors
不可能,因为我不知道我得到什么类型的 id:是 id1 还是 id2 ?
GET /documents/authors?id1=1234
我认为不是真正的 REST,因为 id1 然后指的是“作者”实体,而不是“文档”......
GET /id1-documents/1234/authors
GET /id2-documents/1234/authors
然后您创建两个返回相同实体 (/author) 的 URI,但并不真正符合 REST。
GET /documents/id1=1234/authors
GET /documents/id2=89/authors
它看起来像只为 API 创建的复合键,它没有“后端”的含义。对我来说,动态创建“复合”键听起来很奇怪。
GET /document-authors?id1=1234
GET /document-authors?id2=89
在这种情况下,您完全失去了树的概念...您最终会得到一个仅包含根实体的 API。
你看到另一种选择吗? 哪个最好看?
非常感谢。
【问题讨论】:
-
你能详细说明这两种不同类型的id吗?在您的示例中,它们看起来都像 int,这是否意味着您可以拥有两个不同的文档,其 id 为“89”,但一个文档的 id1 为 89,另一个文档的 id2 为 89?还是 id 在某种程度上是正交/不重叠的?
-
感谢您的评论。两个ID都是整数,没有限制。但是如果 id1 被定义,则 id2 不是并且互惠的。是的,您可以拥有两个不同的文档,其 id 为“89”,但一个文档的 id1 为 89,另一个文档的 id2 为 89。
-
魔鬼在细节中。像这样的 URI 看起来和感觉起来简单自然,但是当您需要在过滤实现的字段中的数据中考虑说“/”时,就会变得更加复杂。查询字符串方法在这方面更容易,但看起来不像恕我直言。
-
抱歉,我不清楚哪个提议最适合您。谢谢
标签: rest api data-modeling