我一直在思考定义具有相互依赖关系的资源集合的正确方法。
例如,让我们考虑可通过 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/create 的角度来看,方法 3 很有趣,但在更新和删除方面有点麻烦。
我可以看到所有这些方法的优点和缺点,因此我正在向可能已经接近并解决过这个问题的人寻求更多指导。
我正在考虑同时使用方法 1 和 2,因此我可以提供所需的所有功能,但我担心我可能过于复杂/重复功能。