当前位置:  开发笔记 > 编程语言 > 正文

为什么REST动词不一定与CRUD动作相对应?

如何解决《为什么REST动词不一定与CRUD动作相对应?》经验,为你挑选了1个好方法。

我参加了Eric Evans(Domain Driven Design的作者)的一次演讲,他指出REST混淆是假设四个REST动作自动映射到四个CRUD动作.即

POST   x=> Create
GET    x=> Read
PUT    x=> Update
DELETE x=> Delete

我有点想念他的推理.关于建筑问题的一些不同之处.

我的问题是:为什么REST操作与CRUD操作不对应?



1> theDmi..:

因为幂等

POST和PUT都可以用于"创建"和"更新"操作.POST和PUT之间的区别在于幂等性:PUT是幂等的,而POST则不是.

幂等性是某些操作的属性......,可以多次应用,而不会将结果更改为初始应用程序之外的结果.- 维基百科

这意味着为了符合HTTP规范,您必须使用PUT进行幂等运算,并将POST用于非幂等运算.这在RFC7231第4.2.2节中规定.

请注意,idempotence由HTTP标准描述,与REST无直接关系.

通过一个例子来理解幂等性是很容易的.让我们对应该创建"客户"资源的REST API进行创建操作.幂等变体看起来如下:

PUT /customers/cust42
{ "name": "John Doe" }

这将创建名为"John Doe"且ID为"cust42"的客户.这里的重要部分是客户端指定ID.如果客户端再次发出相同的PUT请求,则不会创建新资源 - 该操作是幂等的.

另一方面,使用POST,请求将如下所示:

POST /customers
{ "name": "John Doe" } 

服务器确定ID并创建名为"John Doe"的客户资源.此操作不是幂等的,因为再次发出相同的POST将创建第二个用户资源.

因此,在POST或PUT之间进行选择不是"创建"与"更新"的问题.上面的例子都创建了一个资源,但是一个是以幂等方式(PUT)而另一个不是(POST).

与DDD的关系

在DDD中,目标是以对域(及其专家)有意义的方式创建围绕域问题的语言.因此,在CRUD之后命名所有内容通常是个坏主意.

但是,对于DDD,上述指南仍然有用.如果您的DDD应用程序上的状态更改API操作是幂等的,则使用PUT,否则使用POST.有关DELETE的一些很好的面向域的示例,请参阅Guillaume31的答案.

推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有