您可能会遇到的另一种情况是要触发动作。假设您有用于标识某个过程的URL,并且希望能够启动,停止或暂停该过程。 在这种情况下,许多设计师都采用面向动词的,类似于RPC的API设计,但是有些设计选项仍然忠实于基于名词的Web实体模型。 一种是提供流程的状态属性,并允许客户端将其设置为启动,停止或暂停。另一个选择是允许客户端将操作请求发布到相关的URL。例如,流程资源可能具有一个名为actionRequests的属性,其值为URL,如下所示:
{
“id”:”https://example.org/process/123456”,
“kind”: “Process”,
“actionRequests”: “https://example.org/processes/123456/requests”
}
客户端可以将StopRequest,StartRequest,PauseRequest或ResumeRequest实体发布到https://example.org/processes/123456/requests。 如果您希望能够记录谁对流程做了什么以及何时进行记录,则此模型很有用,因为POST可以创建一个真正的持久实体来保存该信息。 该模型在处理可能需要花费一些时间的请求时也很有用,因为POST可以立即返回资源,并且可以随后检查该实体的状态以确定请求的进度。
最后,此设计有一个变体,它允许客户端立即知道在特定时间点哪些请求有效。 如果我们为每种请求类型提供单独的属性,而不是提供单个actionRequests属性,则可以通过判断该属性是否存在,来有效地在特定时间传达特定请求。 如果该过程尚未开始,则其表示可能如下所示:
{
“id”:”https://example.org/process/123456”,
“kind”: “Process”,
“state”: “initial”,
“startRequests”: “https://example.org/process/123456/requests”
}
如果该过程已经开始,则其表示可能如下所示:
{
“id”:”https://example.org/process/123456”,
“kind”: “Process”,
“state”: “running”,
“pauseRequests”: “https://example.org/process/123456/requests”,
“stopRequests”: “https://example.org/process/123456/requests”
}
如果该进程已暂停,则其表示可能如下所示:
{
“id”:”https://example.org/process/123456”,
“kind”: “Process”,
“state”: “pause”,
“resumeRequests”: “https://example.org/process/123456/requests”,
“stopRequests”: “https://example.org/process/123456/requests”
}
这些属性的值是相同的URL还是不同的URL无关紧要。我们从Siren那里学到了这项技术,您可能会想使用它的更详细版本。
(备注:Siren地址 https://github.com/kevinswiber/siren)