【发布时间】:2015-08-28 13:41:15
【问题描述】:
我正在使用 swagger 编写 YAML 文档来设计用于克隆资源的 RESTful API 方法。我有几个选择,不知道哪个是最好的。请问有人可以建议吗?
选项:
- 放弃将资源对象克隆给消费者的责任(消费者将值分配给新对象的属性,然后创建新对象),该过程需要包含对 API 的两个请求: 对源对象的资源进行 GET,然后对该资源进行 POST 以创建新对象。 感觉消费者的责任太大了。
- 使用提供 COPY 方法的 WebDAV HTTP 扩展 (see here)。看来这正是我想要克隆的。 但是,我想尽可能地坚持标准方法
- 发布到 /{resource}?resourceIdToClone={id} 其中 resourceIdToClone 是可选参数。这将与我已经拥有的用于创建资源的 API 路径冲突,在该路径中我将架构添加到 POST 正文。 这意味着使用 POST 到 /{resource}/ 来创建和克隆,这将违反 SRP。
- 添加一个名为 'CloneableResource' 的新资源并执行 POST 到 /CloneableResource/{resource_type}/{resource_source_id}。 对于克隆羊的示例,您将 POST 到 /CloneableResource/Sheep /10。这样,就可以坚持使用标准的 HTTP 方法,不会与任何其他资源路径冲突(或违反 SRP)。但是,我会在域中添加一个新的且可能是多余的类型。我也想不出消费者想要对这个资源执行 POST 以外的任何操作的场景,所以它对我来说似乎是一种代码味道。
- 针对 /resource/{id}?method=clone 的 GET。这里的优点之一是不需要额外的资源,它可以通过一个简单的可选查询字符串参数来确定。我知道这里的风险之一是,如果 URL 位于网页中,则使用 GET 方法提供发布或删除功能可能很危险,因为它可能会被搜索引擎抓取。
感谢您的帮助!
【问题讨论】: