通过REST接口关闭VM
这实际上是蒂姆·布雷(Tim Bray)在2009年提出的一个著名例子。
罗伊·菲尔丁(Roy Fielding)讨论了这个问题,并分享了以下观点:
我个人更喜欢将监视状态(例如电源状态)视为不可编辑的系统。
简而言之,您拥有一个信息资源,可以返回监视状态的当前表示形式。该表示可能包括指向请求更改状态的表单的超媒体链接,并且表单具有指向要处理(每个)更改请求的资源的另一个链接。
塞思·拉德(Seth Ladd)对问题的关键见解
我们已经将“跑步”从一个人的简单状态变成了可以创建,更新和谈论的真实名词。
将其带回重新启动计算机。我认为您应该发布到/ vdc / 434 / cluster / 4894 / server / 4343 / reboots发布后,便拥有一个代表此重新启动的URI ,并且可以获取它以进行状态更新。通过超链接的魔力,重新启动的表示方式链接到重新启动的服务器。
我认为铸造URI空间很便宜,而URI甚至更便宜。创建一个建模为名词的活动集合,然后发布,发布和删除!
RESTful编程是网络规模的Vogon官僚机构。你怎么做任何事情 REST风格的?为此发明新的文书工作,并将其数字化。
用某种更怪异的语言,您正在做的是定义用于“关闭VM” 的域应用程序协议,并标识需要公开/实现该协议的资源。
看你自己的例子
PATCH /api/virtualmachines/42
Content-Type:application/json
{ "state": "shutting down" }
没关系; 您并没有真正将请求本身视为自己的独立信息资源,但是您仍然可以进行管理。
您错过了一点有关变更的表述。
但是,对于PATCH,封闭的实体包含一组指令,这些指令描述了应如何修改当前驻留在源服务器上的资源以产生新版本。
例如,JSON Patch媒体类型格式化说明,就好像您直接修改JSON文档一样
[
{ "op": "replace", "path": "state", "value": "shutting down" }
]
或者,这个想法很接近,但显然不是正确的。 PUT
是目标URL上资源状态的完全替代,因此您可能不会选择看起来像集合的拼写作为单个实体表示的目标。
POST /api/virtualmachines/42/actions
与我们将操作附加到队列的假设相一致
PUT /api/virtualmachines/42/latestAction
与我们正在对队列中的尾项进行更新的假设相一致;这样做有点奇怪。最不惊奇的原则是建议给每个PUT自己唯一的标识符,而不是将它们全部放在一个地方并同时修改多个资源。
请注意,就我们讨论URI的拼写而言,REST无关紧要;/cc719e3a-c772-48ee-b0e6-09b4e7abbf8b
就REST而言,它是完美的URI。与变量名一样,可读性是另外一个问题。使用符合RFC 3986的拼写将使人们更加快乐。
CQRS
如果我们有一个CQRS域,其中包含许多这样的“操作”(又称命令),它们可能潜在地导致多个聚合的更新,或者无法映射到具体资源和子资源上的CRUD操作?
格雷格·扬(Cregs)
CQRS是一种非常简单的模式,可为原本可能不存在的架构提供许多机会。CQRS不是最终的一致性,不是事件,不是消息传递,没有用于读写的分离模型,也不是使用事件源。
当大多数人谈论CQRS时,他们实际上是在将CQRS模式应用于代表应用程序服务边界的对象。
假设您在HTTP / REST上下文中谈论CQRS,那么假设您在后一种上下文中工作似乎很合理,因此让我们开始吧。
令人惊讶的是,这比上一个示例更容易。原因很简单:命令是message。
Jim Webber将HTTP描述为1950年代办公室的应用协议。通过接收邮件并将其放入收件箱来完成工作。同样的想法仍然存在-我们得到一份表格的空白副本,用我们知道的细节填写表格,然后进行交付。塔达
我们是否应该在可能的情况下尝试建模尽可能多的命令,具体取决于在具体资源上创建或更新的具体资源(遵循示例I的第一种方法),其余部分使用“动作端点”?
是的,只要“具体资源”是消息,而不是域模型中的实体。
关键思想:您的REST API仍然是一个接口;您应该能够更改基础模型,而无需客户端更改消息。发布新模型时,会发布Web终结点的新版本,这些版本知道如何采用域协议并将其应用于新模型。
CQRS模型是否更适合RPC之类的API?
并非如此-特别是Web缓存是“最终一致的读取模型”的一个很好的例子。使每个视图都可独立寻址,每个视图都有自己的缓存规则,从而使您可以免费扩展一堆。完全采用RPC方式进行读取的吸引力相对较小。
对于写入而言,这是一个棘手的问题:将所有命令发送到单个端点或单个端点族的单个处理程序肯定更容易。REST实际上更多地是关于如何找到端点与客户端的通信方式。
将消息视为自己的唯一资源具有以下优点:可以使用PUT,向中介组件提醒消息处理是幂等的事实,以便它们可以参与某些错误处理情况,这是很高兴的事情。(注意:从客户端的角度来看,如果资源具有不同的URI,那么它们就是不同的资源;事实上,它们在原始服务器上可能都具有相同的请求处理程序代码,这是制服所隐藏的实现细节。接口)。
菲尔丁(2008)
我还应注意,以上内容尚未完全实现RESTful,至少我是如何使用该术语的。我所做的只是描述了服务接口,仅此而已。为了使其成为RESTful,我将需要添加超文本来引入和定义服务,描述如何使用表单和/或链接模板执行映射,并提供代码以有用的方式组合可视化。