我一直在思考定义具有相互依赖的资源集合的正确方法。
例如,让我们考虑“文档”和“评论”,它们可以通过以下URI独立访问:
/documents/{doc-uri}
/comments/{comment-id}
然而,我们通常希望获取与特定文档相关的评论集合。这就引出了一个设计问题,涉及如何构建这个集合。
我可以看到几个主要选项:
1.) 在文档 uri 后提供一个评论集合 uri
GET /documents/{doc-uri}/comments/
2.) 提供一个参数给评论集合,以选择文档
GET /comments/{comment-id}?related-doc={doc-uri}
3.) 使用内容协商通过 Accept 头请求相关的评论被返回。
// Get all the comments for a document
GET /documents/{doc-uri} Accept: application/vnd.comments+xml
// Create a new comment
POST /documents/{doc-uri} Content-Type: application/vnd.comment+xml <comment>...</comment>
方法1的优点在于自动将评论放置在文档的上下文中,这也很好地支持了使用POST/PUT创建、更新和删除评论。然而,它不提供对文档之外评论的全局访问。因此,如果我们想要在系统中搜索所有评论,我们需要使用方法#2。
方法2提供了与方法1许多相同的优点,但是在没有文档上下文的情况下创建评论是没有意义的,因为评论必须明确与文档相关联。
从GET和POST/创建的角度来看,方法3很有趣,但是更新和删除可能会有些复杂。
我可以看到这些方法的利弊,因此我正在寻找一些解决这个问题的指导。
我正在考虑同时使用方法1和方法2,这样我可以提供所需的所有功能,但我担心可能会过于复杂/重复功能。