- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我参加了 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 中,目标是以对领域(及其专家)有意义的方式围绕领域问题创建一种语言。因此,以 CRUD 命名所有内容通常不是一个好主意。
但是,对于 DDD,上述指南仍然有用。如果您的 DDD 应用程序具有幂等的状态更改 API 操作,则使用 PUT,否则使用 POST。有关 DELETE 的一些良好的面向域的示例,请参阅 Guillaume31 的答案。
关于rest - 为什么 REST 动词不一定对应于 CRUD 操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34461028/
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 9 年前。 Improv
我刚刚发现了这门语言,我想知道是否可以使用数据库制作基本的 CRUD 网络应用程序。 最佳答案 有 mysql 的库和 postgresql , 核心库提供了一个 web server支持 HTTP、
Symfony 4.0 发布后,不再支持 SensioGeneratorBundle .因此命令 php app/console generate:doctrine:crud不可用。 他们建议使用 M
在开发 Web 应用程序时,我通常会看到人们执行增删改查和同步 View 的两种方式。 这里是使用 ajax 的高级示例。 1-方法一 创建操作可能涉及 POST 请求,成功后只需执行另一个 GET
我已经成功地使用 Yii2 模型和 CRUD 生成器为我的网络应用程序获取了一些框架代码文件。特别是,CRUD Generator 声称已成功将其 View 文件创建到: /basic/views//
在我的项目中,我一直在使用 Django 的通用 CRUD View 来处理很多事情。我现在想开始迁移到 DJango 1.3 中基于类的新样式通用 CRUD View 。我没有发现这些文档有多大帮助
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题?通过 editing this post 添加详细信息并澄清问题. 7年前关闭。 Improve this
我希望标题不要太含糊,所以这里是: 我创建了一个 MySQL 数据库,其中存储了两个表:一个包含输入数据,另一个包含输出数据。 之后我编写了一个程序,连接到这个特定的数据库,从输入表中提取数据,解析它
我需要编辑我的实体以获得更多值。我已经用我之前的值生成了 crud。如何在编辑实体后通过应用程序/控制台重新生成 crud,以便它自动为其他值生成函数。 最佳答案 为此,您需要删除为此 crud 生成
因此,我仅使用 JavaScript 创建了一个简单的 CRUD 应用程序。现在,您可以将国家/地区添加到数组中并从数组中删除国家/地区。我希望能够编辑数组中的现有国家/地区,例如我想将“斯德哥尔摩”
我想让java中的一个类有一个可以与Hibernate配置交互并执行某些操作的方法,该方法被标识为ENUM(例如:读取,更新,添加,删除等) 方法参数应为(枚举操作、类 DTO、NamedQuery
我正在构建一个 React 应用程序,并使用 auth0 来登录/验证用户。 在使用 auth0 之前,我一直在对 API 进行 CRUD 调用来发布帖子。这又是在使用 auth0 之前、在我拥有用户
尝试使用 BlueJ 构建我的第一个 Java MySQL CRUD 应用程序。我可以运行该应用程序并将数据写入 MySQL 数据库。但是,当我运行搜索函数时,我得到了 Java .NullPoint
我正在试用 Microsoft Master Data Services,我想以编程方式将数据添加到数据库中。我开始获得模型/实体/成员结构,但我还不确定。如果您对此结构有很好的解释,请分享。 假设有
我正在尝试开发一个 Backbone Marionette 应用程序,我需要知道如何以最佳方式执行 CRUD(创建、读取、更新和销毁)操作。我找不到任何解释这一点的资源(仅适用于 Backbone)。
我已经根据文档和 medium article 模拟了与 Room 的多对多关系。 .使用这个@Relation,我可以从数据库中检索RecipeWithIngredients 或Ingredient
Closed. This question is opinion-based。它当前不接受答案。 想要改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。 3年前关闭。
通过AngularJS通过REST进行CRUD操作的最佳实践是什么? 特别是这里的 Angular-Way 。我的意思是使用最少代码和最默认 Angular 设置来达到此目的的方式。 我知道$ res
我无法弄清楚我的更新功能。我能够从数据库中检索和删除,但我不知道如何更新。这对我来说是全新的,所以我很困惑。 .js 文件 //update user $("#btnUpdateUser").clic
我正在寻找一种对用户透明的 CRUD 操作后重新加载页面的方法。 实际上,在创建或删除之后,我必须重新加载页面才能显示我的操作。 我使用 api 来实现这个,当我将它与 json 文件一起使用时,它工
我是一名优秀的程序员,十分优秀!