我必须设计一个API来管理Document实体:这个实体的原创性是它可以有两个不同的ID:
对于每个文档,只有一个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只包含根实体。
你看到另一种选择吗? 哪一个看起来最好?
非常感谢。
答案 0 :(得分:1)
在我看来,您在这里混淆了两种不同的资源 - documents
和authors
。 document
与author
有关系,但它们应该是单独的资源,因为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