REST和CRUD之间的区别


168

我学习了REST,感觉很像CRUD(根据我对CRUD的了解)。

我知道它们是不同的,并且我想知道是否认为它们相似意味着我不理解它们。

REST是CRUD的“超集”吗?CRUD所做的一切以及更多吗?


17
认为它们相似意味着您确实了解它们。在阅读答案时,我看到了一个令人惊讶的事实,即我承认概念之间的相似性,这是不正确的。我相信理解REST的正确方法将其视为“用于HTTP资源的CRUD”。如果您了解HTTP资源是什么(显然与数据库记录不同)并且知道CRUD是什么,那么将REST描述为“用于HTTP资源的CRUD”是传达REST本质的正确而简洁的方法。
Jason Livesay 2014年

Answers:


205

令人惊讶的是,我没有在其他答案中看到我认为REST和CRUD之间真正的区别:每个人管理的是什么。

CRUD表示要在数据存储库中完成的基本操作。您直接处理记录或数据对象;除这些操作外,记录是被动实体。通常,它只是数据库表和记录。

另一方面,REST在资源表示上运行,每个资源表示由URL标识。这些通常不是数据对象,而是复杂的对象抽象。

例如,资源可以是用户的评论。这不仅意味着“评论”表中的记录,还意味着它与“用户”资源的关系,该评论所附加的帖子,或者它所响应的另一个评论。

对注释进行操作不是原始的数据库操作,它可能会产生严重的副作用,例如向原始海报发出警报,重新计算一些类似于游戏的“点”或更新一些“跟随者流”。

而且,资源表示包括超文本(请检查HATEOAS原理),允许设计人员表达资源之间的关系,或在操作的工作流程中指导REST客户端。

简而言之,CRUD是一组原始操作(主要用于数据库和静态数据存储),而REST是一种非常高级的API样式(主要用于Web服务和其他“实时”系统)。

第一个操作基本数据,另一个与复杂的系统交互。


3
@哈维尔感谢您将它们分开。我使用REST学习Rails,给人的印象是它是CRUD的替代品(我从那以后才知道...这个名字,我已经在使用它,只是不知道该怎么称呼)...将REST与CRUD从比较2个苹果转变为比较苹果和橘子。谢谢
杰西·布莱克

2
@Maudicus:我认为这很普遍,因为RoR包括一个CRUD层(就像大多数(每个?)框架一样),并且可以很容易地(自动?)在上面添加REST API,所以很容易想到REST是什么。但是,您可以在CRUD之上但在REST API后面添加功能,从而使它们越来越不同。
哈维尔

1
您的答案是正确的,但是示例不是最佳的:注释可以简化为一个数据库行,并且是否可以通过数据库触发器对相关对象进行动态更改?我觉得,尽管在Restful API中不只是粗鲁的操作,而且您的回答显然带有这种感觉。
didierc 2014年

2
所以...相同的东西,不同的层:)
AlikElzin-kilaka 2014年

非常感谢您表达这一观点!我还要补充说,HTTP动词对CRUD操作的限制导致将REST真正地实现为CRUD,并且使用许多工具来推广CRUD样板,并错过了这种自定义的“操作注释”逻辑。
sompylasar's

99

首先,两者都是简单的缩写。他们没什么好害怕的。

现在,CRUD是一个简单的术语,因为它是许多应用程序中的通用功能,所以缩写了CRUD。它描述了您可以对数据(或资源)执行的4种基本操作。创建,读取,更新,删除。

但是,REST是一种有名的做法(就像AJAX一样),本身并不是一项技术。它鼓励使用HTTP协议中早已固有但很少使用的功能。

如果您有一个URL(统一资源定位符),并且您的浏览器通过地址行将其指向该地址,那么您将发送一个HTTP请求。每个HTTP请求都包含服务器可以用来了解哪个HTTP响应发送回发出请求的客户端的信息。

每个请求都包含一个URL,因此服务器知道您要访问的资源,但是它也可以包含一个method。一种方法,介绍了在与资源。

但是这种“方法”概念并不经常使用。

通常,人们只是通过GET方法链接到页面,并通过POST方法发布任何类型的更新(删除,插入,更新)。

因此,您无法将一种资源(URL)本身视为真正的资源。您必须具有单独的URL,才能删除,插入或更新同一资源。例如:

http://...com/posts/create- POST request  -> Goes to posts.create() method in the server
http://...com/posts/1/show- GET request  -> Goes to posts.show(1) method in the server
http://...com/posts/1/delete - POST request  -> Goes to posts.delete(1) method in the server
http://...com/posts/1/edit- POST request  -> Goes to posts.edit(1) method in the server

使用REST,您可以创建更智能的表单,因为它们使用POST之外的其他HTTP方法,并对服务器进行编程以能够区分方法,而不仅仅是URLS。因此,例如:

http://...com/posts - POST request  -> Goes to posts.create() method in the server
http://...com/posts/1 - GET request  -> Goes to posts.show(1) method in the server
http://...com/posts/1 - DELETE request  -> Goes to posts.delete(1) method in the server
http://...com/posts/1 - PUT request  -> Goes to posts.edit(1) method in the server

请记住,单个URL描述单个资源。一个帖子就是一个资源。使用REST,您可以按照对待资源的方式来对待资源。您正在告诉服务器要处理的资源以及如何处理它。

“ RESTful体系结构”还有许多其他功能,如果您感兴趣的话,可以在Wikipedia,其他文章或书籍中阅读。另一方面,CRUD本身并没有太多其他功能。


4
抱歉,但REST 比CRUD多了不少。主要是因为资源所包含的内容远不止单个记录,而且每个操作都比更新记录要多得多。
哈维尔

11
好。我同意。你为什么觉得抱歉?我没有说这不只是CRUD。我想这正是我没有说。
Yam Marcovic

4
这应该是正确的答案。
布兰登2014年

HTML规范仅允许GET和POST方法提交表单,因此在AJAX广泛使用之前,其他方法未用于处理来自Web客户端的服务。某些服务使用名称为“ _method”的隐藏输入字段作为解决方法,以指定除POST以外的方法,同时仍使用POST方法提交表单。
肯尼斯·桑德奎斯特

20

REST代表“代表性状态转移”,这意味着它全部与通信和修改系统中某些资源的状态有关。

REST参与其中,因为REST背后的理论涉及利用媒体,超媒体和底层协议来管理远程系统上的信息。

另一方面,CRUD是数据库中数据所需的常用操作的助记符:Create Retrieve Update Delete。但这确实没有比这更深入的了。

因此,这就是您的问题的答案,但是我将提及在一起讨论REST和CRUD时遇到的常见错误。许多开发人员希望将REST直接映射到CRUD,因为HTTP上的REST提供了GET PUT POST和DELETE,而CRUD提供了CREATE RETRIEVE UPDATE DELETE。想要将REST动词直接映射到CRUD操作是很自然的。

但是,HTTP使用“创建或更新”样式,而CRUD将创建和更新分开。这使得不可能(!)在两者之间进行清晰,通用的映射(!)

GET和DELETE很容易... GET ===检索,而DELETE === DELETE。

但是根据HTTP规范,PUT实际上是Create AND Update:

  • 了解有关对象的所有信息(包括其标识符)后,可使用PUT创建一个全新的对象

  • 使用PUT更新对象(通常使用对象的完整表示)

POST是“处理”动词,被认为是“追加”动词:

  • 使用POST将新对象附加到集合中-即创建一个新对象

  • 当其他动词都不适合时,也会使用POST,因为HTTP规范将其定义为“数据处理”动词

  • 如果您的团队正忙于POST,请记住整个WWW都建立在GET和POST上;)

因此,尽管REST和CRUD之间有相似之处,但我看到大多数团队都犯了一个错误,就是要使两者相等。在定义REST API时,团队确实需要小心,不要过于依赖CRUD助记符,因为REST实际上确实具有很多额外的复杂性,无法完全映射到CRUD。


7

CRUD为数据读取和写入指定了一组最少的基本存储动词:创建,读取,更新和删除。然后,您可以通过汇总其他操作来构建它们。这些通常被认为是数据库操作,但是认为数据库是任意的(例如,可以是关系DBMS,但也可以是YAML文件)。

REST是一种“建筑风格”,通常包括CRUD操作和其他更高级别的操作,所有这些操作都将在“资源”(任意的,但是这些是应用程序中的实体)概念上执行。REST有很多使其变得有趣的约束(特别是与HTTP完美结合)。

REST接口可以但不必公开特定资源上的所有CRUD操作。REST界面中可用的内容是任意的,并且可能会由于系统权限,UI注意事项以及界面设计和创建当天的温度而有所变化。日子越热越好,通常会带来更多的简约界面,尽管事实恰恰相反。


谢谢亚尔。看来我的“ CRUD还能做更多事情吗?” 是的,REST的技术性不仅仅适用于数据库中的条目。
杰西·布莱克

@Maudicus我更新了答案,但要具体说明:它可以但不必这样做。
丹·罗森斯塔克2011年

我不会说它们是您的应用程序完整所必需的。本质上,某些应用程序不需要插入,删除或更新。
Yam Marcovic

@Yam Marcovic,好的,已调整
Dan Rosenstark 2011年

6

欺诈

  • CRUD是SQL命令的四种基本类型:创建,读取,更新和删除
  • 大多数应用程序都具有某种CRUD功能
  • CRUD应用程序是一种使用表单将数据获取数据库中的数据的应用程序。

休息

  • REST代表代表性状态转移。(有时拼写为“ ReST”)

  • 它依赖于无状态,客户端-服务器,可缓存的通信协议-几乎在所有情况下,都使用HTTP协议

  • REST是用于设计网络应用程序的体系结构样式


2

REST就像是机器的网页,他们可以浏览它们,而CRUD就像是SOAP,它与客户端紧密耦合。这些是主要区别。Ofc。它们在表面上相似,但是CRUD描述了基本的实体操作,而REST可以描述任何应用程序的接口。REST可以使用更多的4种HTTP方法的另一个区别。如果我想收集所有差异,那将是一个很长的答案,如果您检查有关REST与SOAP的问题,那么您将找到其中的大部分。

我认为将REST与CRUD混淆是一个非常常见的错误,原因是开发人员没有时间深入了解REST。他们只是想基于类似开发人员编写的有限CRUD样式示例来使用该技术,而不了解它。绝大多数示例和教程反映出严重缺乏知识。将REST资源映射到实体,将HTTP方法映射到这些实体的CRUD操作,并在没有超链接的情况下使用REST只是一种症状。通过REST,您可以将超链接(包括具有POST / PUT / DELETE / PATCH方法的链接)映射到您的操作,并通过检查(通常是特定于API的)链接关系来在客户端识别该操作。如果REST客户端不知道什么是链接关系,并且仅知道HTTP方法,也许还知道某些URI模板,那么那不是REST客户端,而是HTTP客户端上的CRUD。REST客户端的另一个常见错误是浏览器中运行的单页javascript应用程序。当然,您可以实现这样的客户端,但是REST主要用于自动客户端(由您甚至不知道的开发人员编写的服务器端应用程序),而不是针对手动客户端(由您编写的用户控制的浏览器应用程序)。仅拥有一个浏览器客户端可能表明您确实不需要REST,并且您对该项目进行了过度设计。在这些情况下,CRUD API是可行的解决方案,开发人员将这些CRUD API称为REST,因为他们不知道两者之间的区别。当然,您可以实现这样的客户端,但是REST主要用于自动客户端(由您甚至不知道的开发人员编写的服务器端应用程序),而不是针对手动客户端(由您编写的用户控制的浏览器应用程序)。仅拥有一个浏览器客户端可能表明您确实不需要REST,并且您对该项目进行了过度设计。在这些情况下,CRUD API是可行的解决方案,开发人员将这些CRUD API称为REST,因为他们不知道两者之间的区别。当然,您可以实现这样的客户端,但是REST主要用于自动客户端(由您甚至不知道的开发人员编写的服务器端应用程序),而不是针对手动客户端(由您编写的用户控制的浏览器应用程序)。仅拥有一个浏览器客户端可能表明您确实不需要REST,并且您对该项目进行了过度设计。在这些情况下,CRUD API是可行的解决方案,开发人员将这些CRUD API称为REST,因为他们不知道两者之间的区别。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.