首先,请允许我纠正您对这些方法的理解。
POST就是创建一个全新的资源。您将一些数据发送到服务器,并期望得到一个响应,说明这个新资源是在哪里创建的。期望是,如果您POST
将/things/
新资源存储在/things/theNewThing/
. 您将POST
其留给服务器来决定创建的资源的名称。发送多个相同POST
的请求会产生多个资源,每个资源都有自己的“事物”和自己的 URI(除非服务器有一些额外的逻辑来检测重复项)。
PUT主要是关于创建资源。PUT
和之间的第一个主要区别POST
是PUT
让客户端控制 URI。一般来说,你并不真的想要这个,但这就是重点。另一件事就是PUT
不要修改,如果您仔细阅读规范,它会声明您将 URI 中的任何资源替换为全新版本。这看起来像是在进行修改,但实际上只是在同一个 URI 上的全新资源。
顾名思义,PATCHPATCH
用于获取资源。您向服务器发送描述如何修改特定资源的数据。考虑一个巨大的资源,PATCH
允许您发送您希望更改的少量数据,同时PUT
需要您发送整个新版本。
其次,考虑资源。您有一组表,每个表都有很多行,这相当于一组包含许多资源的集合。现在,您的问题是您希望能够原子地添加资源并同时删除它们。所以你不能只是POST
then DELETE
,因为这显然不是原子的。PATCH
桌子怎么可能……
{ "add": [
{ /* a resource */ },
{ /* a resource */ } ],
"remove" : [ "id one", "id two" ] }
在那个主体中,我们已将数据发送到服务器,以在服务器中创建两个资源并删除两个资源。现在,这有一个缺点,那就是很难让客户知道发生了什么。这两个新资源的客户端没有“正确”的方式,204 created
有点像,但意味着有一个新资源的 URI 的标头……但我们添加了两个。可悲的是,无论如何你都会遇到这个问题,简单的 HTTP 并不是为了一次处理多个资源而设计的。
交易资源
所以这是人们提出的常见解决方案,我认为它很臭。基本思想是您首先POST
/PUT
服务器上的一个数据块对您希望进行的交易进行编码。然后,您使用另一种方法来“激活”此交易。
等等……那是两个请求……它发送的数据与您发送的数据相同PATCH
,然后您甚至更多地捏造了 HTTP,以便以某种方式“激活”该事务。更重要的是,我们现在有这个“交易”资源!我们甚至用它做什么?