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

REST是CRUD的“超集”吗?它可以完成CRUD的所有工作吗?

评论

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

#1 楼

出乎意料的是,我没有在其他答案中看到我认为REST和CRUD之间真正的区别:每个人管理的内容。您直接处理记录或数据对象;除这些操作外,记录是被动实体。通常,它只是数据库表和记录。另一方面,REST对资源表示进行操作,每个资源表示由URL标识。这些通常不是数据对象,而是复杂的对象抽象。例如,资源可以是用户的注释。这不仅意味着“评论”表中的记录,还意味着它与“用户”资源的关系,该评论所附加的帖子,或者它所响应的另一条评论。

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

另外,资源表示包括超文本(请检查HATEOAS原理),允许设计人员表达资源之间的关系,或在操作的工作流中引导REST客户端。基本操作(主要用于数据库和静态数据存储),而REST是一种非常高级的API样式(主要用于Web服务和其他“实时”系统)。

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

评论


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

–杰西·布莱克(Jesse Black)
2011年11月21日在5:44

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

–哈维尔
2011年11月22日在1:07

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

– didierc
2014年7月21日在6:42

所以...相同的东西,不同的层:)

– AlikElzin-kilaka
2014年8月8日在12:08

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

–sompylasar
17年5月29日在0:51

#2 楼

首先,两者都是简单的缩写。不用担心。

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

REST是一种命名实践(就像AJAX一样),而不是一种技术本身。
它鼓励使用长期以来固有的功能。 HTTP协议,但很少使用。

当您具有URL(统一资源定位符)并且通过地址行将浏览器指向该协议时,您正在发送HTTP请求。每个HTTP请求都包含服务器可以用来知道将哪个HTTP响应发送回发出请求的客户端的信息。每个请求都包含一个URL,因此服务器知道您要访问哪个资源。 ,但它也可以包含一个方法。一种方法描述了如何处理该资源。

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

通常,人们只是通过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本身并没有太多其他功能。

评论


对不起,但是REST远不止CRUD。主要是因为资源所包含的内容远不止单个记录,而且每个操作所要做的远不止更新记录。

–哈维尔
2011年11月21日,下午3:23

好。我同意。你为什么觉得抱歉?我没有说这不只是CRUD。我认为这正是我所说的。

–任马可维奇
2011年11月21日17:36

这应该是正确的答案。

–布兰登
2014年5月9日16:11

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

–肯尼斯·桑德奎斯特(Kenneth Sundqvist)
19-09-24在21:28

#3 楼

REST代表“代表性状态转移”,这意味着所有有关通信和修改系统中某些资源的状态的信息。另一方面,CRUD是管理远程系统上信息的基础协议。另一方面,CRUD是数据库中数据所需的常用操作的助记符:创建检索更新删除。但这确实没有比这更深入的内容。许多开发人员希望将REST直接映射到CRUD,因为HTTP上的REST提供了GET PUT POST和DELETE,而CRUD提供了CREATE RETRIEVE UPDATE DELETE。将REST动词直接映射到CRUD操作是很自然的。

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

GET和DELETE很容易... GET === RETRIEVE和DELETE === DELETE。 br />
但是,按照HTTP规范,PUT实际上是Create AND Update:


当您了解所有有关对象(包括其标识符)的信息时,请使用PUT创建一个全新的对象
使用PUT更新对象(通常使用对象的完整表示形式)

POST是“处理”动词,被视为“附加”动词:


使用POST将新对象追加到集合中-即创建一个新对象
当其他动词都不适合时,也使用POST,因为HTTP规范定义为“数据处理”动词
如果您的团队正忙于POST,请记住整个WWW都是基于GET和POST的;)

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

#4 楼

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

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

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

评论


谢谢亚尔。似乎我的“ CRUD所做的一切还更多吗?”是的,REST的技术性不仅仅适用于数据库中的条目。

–杰西·布莱克(Jesse Black)
2011年11月20日在7:06

@Maudicus我更新了答案,但具体来说:它可以但不必这样做。

–丹·罗森斯塔克(Dan Rosenstark)
2011年11月20日7:07

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

–任马可维奇
2011年11月20日7:37

@Yam Marcovic,好的,已调整

–丹·罗森斯塔克(Dan Rosenstark)
2011-11-20 8:39

#5 楼

CRUD


CRUD是SQL命令的四种基本类型:创建,读取,更新和删除
大多数应用程序具有某种CRUD功能。使用表格将数据获取数据库中的数据的一种形式。REST代表表示状态转移。
它依赖于无状态,客户端-服务器,可缓存的通信协议-几乎在所有情况下,都使用HTTP协议。
REST是用于设计联网应用程序的体系结构风格。


#6 楼

REST就像是供机器浏览的网页,而CRUD则是与SOAP紧密耦合的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,因为他们不知道区别。