gpt4 book ai didi

rest - 为什么 REST 动词不一定对应于 CRUD 操作?

转载 作者:可可西里 更新时间:2023-11-01 15:12:51 25 4
gpt4 key购买 nike

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

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

我有点想念他的推理。关于架构问题的一些不同之处。

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

最佳答案

因为幂等性

POST 和 PUT 都可以用于“创建”和“更新”操作。 POST 和 PUT 的区别在于幂等性:PUT 是幂等的,而 POST 不是。

Idempotence is the property of certain operations ..., that can be applied multiple times without changing the result beyond the initial application.

这意味着为了符合 HTTP 规范,您必须使用 PUT 进行幂等操作,使用 POST 进行非幂等操作。这在 RFC7231 section 4.2.2 中指定.

请注意,幂等性由 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 的答案。

关于rest - 为什么 REST 动词不一定对应于 CRUD 操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34461028/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com