RESTAPI中的事务

RESTAPI中的事务,rest,restful-architecture,Rest,Restful Architecture,我有一些资源,用户必须在这些资源上执行批准/拒绝工作流 我遇到的问题是,我需要在一个事务中更新当前审批步骤并创建新的审批步骤。因此,我可以做到以下几点: 在用户批准或拒绝后更新当前批准步骤 PUT myapi/approval_step/1 {status: "approved"} // or status="rejected" 然后创建下一个审批步骤: POST myapi/approval_step/ {...} 但我需要在一个事务中同时更新和创建 那么,我如何解决这个问题并为我的案

我有一些资源,用户必须在这些资源上执行批准/拒绝工作流

我遇到的问题是,我需要在一个事务中更新当前审批步骤并创建新的审批步骤。因此,我可以做到以下几点:

在用户批准或拒绝后更新当前批准步骤

PUT myapi/approval_step/1 
{status: "approved"} // or status="rejected" 
然后创建下一个审批步骤:

POST myapi/approval_step/
{...}
但我需要在一个事务中同时更新和创建

那么,我如何解决这个问题并为我的案例构建优雅的RESTAPI呢

对我来说最简单的似乎就是引入拒绝和批准动词,如:

myapi发布/批准\步骤/2/拒绝 和
POST myapi/approval\u step/2/approve将更新现有的审批步骤并创建新的审批步骤,但在设计REST API时应避免使用动词。首先,不应使用PUT进行部分更新。PUT是目标资源的完全替换。所以,做你想做的事,要么打补丁,要么发帖子。由于需要在同一操作中更新和创建新内容,请使用POST。POST是一种用于任何未被HTTP协议标准化的操作的方法,因此您可以使用它做任何您想做的事情,只要它有适当的文档记录

但在设计RESTAPI时应避免使用动词

我真的很想知道在设计RESTAPI时应该避免使用动词的想法是从哪里来的。这毫无意义,因为URI的内部语义在REST中是不相关的。URI是一个原子标识符,文本对人的意义与应用程序完全无关

这样做没有错:

POST myapi/approval_step/2/approve
问题是这样的:

POST myapi/approve

{"approval_step": 2}
POST myapi

{"method": "approve"
 "args": {"approval_step": 2}}
我想有人在某个地方读到了这是错误的,出于某种原因得出结论,这是因为URI中有一个动词,而不是因为资源是由有效负载而不是URI标识的

如果不清楚,更糟糕的例子是这样做:

POST myapi/approve

{"approval_step": 2}
POST myapi

{"method": "approve"
 "args": {"approval_step": 2}}

这显然是RPC,而不是REST,因为与API的所有交互都通过一个端点,有效负载标识您想要做的一切。这是您在REST中应该避免的,而不是URI中的动词是错误的废话。

当您想要遵守REST原则时,URL中并不是禁止使用动词。使用它们只是一种异味,可能意味着有人试图覆盖协议语义

比如说,

GET /myapi/createApproval
这是非常糟糕和错误的,因为谓词重写了HTTP谓词GET的含义,并错误地使用它来实现资源状态转换,从而导致调用不安全

HTTP是web的底层协议,符合其语义会产生一些后果,这是在设计API时需要预见的。这与方法的幂等性和安全性有关。遵守这些规则可以确保您的API在可伸缩性、可缓存性、与代理的一致性等方面是有用的

在我看来,只要不违反基本协议定义的规则,就可以使用动词。有人可能会争论带有动词的URL是否是有意义的资源标识符。与批准相比,批准并不是一种直观的资源

你可以和我一起去

PUT    myapi/approval_step/2/approval
标记步骤的批准,并

DELETE myapi/approval_step/2/approval
要移除它

但是,请注意,只有当您希望实际的开发人员阅读某种文档并针对其编写客户端时,URL的格式才显得相关。这比任何动词都更像是一个安静的问题

在真正的RESTful体系结构中,人类永远不需要读取或理解URL,因为应用程序客户端本身可以基于服务返回的超媒体获取链接。这需要使用定义良好的格式,但这不是一件容易的事情。许多被认为是RESTful的API甚至懒得遵循HATEOS

更多信息,请参阅Roy Fielding的博客文章


Leonard Richardson、Mike Amundsen和Sam Ruby深入介绍了HATEOAS及其优缺点、超媒体驱动API的设计、资源状态和应用程序状态的概念。在我看来,这是一本非常好的书。不仅要学习如何做REST,还要意识到你是否真的想要或需要做它。

类似于{'status':'approved','new':{…}之类的东西?不要认为它看起来非常优雅。嘿@Pedro Werneck,我认为人们习惯于看到这样的导游:。可能是因为动词是一种代码味道。是的,我知道那个指南,但我真的是指第一个从那个胡说八道开始的。