具有两个不同键的实体的REST API URI

时间:2017-08-18 12:43:57

标签: rest api data-modeling

我必须设计一个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只包含根实体。

你看到另一种选择吗? 哪一个看起来最好?

非常感谢。

2 个答案:

答案 0 :(得分:1)

在我看来,您在这里混淆了两种不同的资源 - documentsauthorsdocumentauthor有关系,但它们应该是单独的资源,因为author存在于任何单个文档中。考虑到这一点,您需要询问您的客户是否正在搜索作者或文档。如果是作者,那么他们应该查询作者API而不是文档API。

例如对于id1 89或id1 1234或id2 4444的所有文档作者,您可能会这样查询......

GET /authors?docId1=89&docId1=1234&docId2=4444

那应该返回作者表示的列表。如果人们关心文档本身,作者表示可能包含文档的链接。

或者,如果您正在寻找documents,那么您应该直接查询...

GET /documents?id1=89&id1=1234&id2=4444

您作为子资源建模的内容并非真正子资源。它是2个独立资源之间的关系,应该建模为一组链接。从documents api返回的每个文档都应包含一组authors链接(如果人们真的关心作者),反之亦然,从作者到文档。

答案 1 :(得分:1)

这是来自SlashDB的一个自以为是的解决方案,它允许同时记录过滤和遍历相关资源。

这个例子类似于你的 - 两个实体艺术家和专辑。

让我们先识别艺术家。

ID的艺术家:

https://demo.slashdb.com/db/Chinook/Artist/ArtistId/2

艺术家姓名:

https://demo.slashdb.com/db/Chinook/Artist/Name/Accept

艺术家可能已经发行了专辑。这两个实体是相关的。我们允许使用相关实体的名称扩展URL,如下所示:

https://demo.slashdb.com/db/Chinook/Artist/Name/Accept/Album

你可以继续“前进”,比如从这些专辑中获取曲目

https://demo.slashdb.com/db/Chinook/Artist/Name/Accept/Album/Track

甚至继续过滤,即只有短于300000毫秒的曲目:

https://demo.slashdb.com/db/Chinook/Artist/Name/Accept/Album/Track/Milliseconds/..300000