我学习了REST,感觉很像CRUD(根据我对CRUD的了解)。
我知道它们是不同的,并且我想知道是否认为它们相似意味着我不理解它们。
REST是CRUD的“超集”吗?CRUD所做的一切以及更多吗?
我学习了REST,感觉很像CRUD(根据我对CRUD的了解)。
我知道它们是不同的,并且我想知道是否认为它们相似意味着我不理解它们。
REST是CRUD的“超集”吗?CRUD所做的一切以及更多吗?
Answers:
令人惊讶的是,我没有在其他答案中看到我认为REST和CRUD之间真正的区别:每个人管理的是什么。
CRUD表示要在数据存储库中完成的基本操作。您直接处理记录或数据对象;除这些操作外,记录是被动实体。通常,它只是数据库表和记录。
另一方面,REST在资源表示上运行,每个资源表示由URL标识。这些通常不是数据对象,而是复杂的对象抽象。
例如,资源可以是用户的评论。这不仅意味着“评论”表中的记录,还意味着它与“用户”资源的关系,该评论所附加的帖子,或者它所响应的另一个评论。
对注释进行操作不是原始的数据库操作,它可能会产生严重的副作用,例如向原始海报发出警报,重新计算一些类似于游戏的“点”或更新一些“跟随者流”。
而且,资源表示包括超文本(请检查HATEOAS原理),允许设计人员表达资源之间的关系,或在操作的工作流程中指导REST客户端。
简而言之,CRUD是一组原始操作(主要用于数据库和静态数据存储),而REST是一种非常高级的API样式(主要用于Web服务和其他“实时”系统)。
第一个操作基本数据,另一个与复杂的系统交互。
首先,两者都是简单的缩写。他们没什么好害怕的。
现在,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本身并没有太多其他功能。
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。
CRUD为数据读取和写入指定了一组最少的基本存储动词:创建,读取,更新和删除。然后,您可以通过汇总其他操作来构建它们。这些通常被认为是数据库操作,但是认为数据库是任意的(例如,可以是关系DBMS,但也可以是YAML文件)。
REST是一种“建筑风格”,通常包括CRUD操作和其他更高级别的操作,所有这些操作都将在“资源”(任意的,但是这些是应用程序中的实体)概念上执行。REST有很多使其变得有趣的约束(特别是与HTTP完美结合)。
REST接口可以但不必公开特定资源上的所有CRUD操作。REST界面中可用的内容是任意的,并且可能会由于系统权限,UI注意事项以及界面设计和创建当天的温度而有所变化。日子越热越好,通常会带来更多的简约界面,尽管事实恰恰相反。
欺诈
休息
REST代表代表性状态转移。(有时拼写为“ ReST”)
它依赖于无状态,客户端-服务器,可缓存的通信协议-几乎在所有情况下,都使用HTTP协议
REST是用于设计网络应用程序的体系结构样式
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,因为他们不知道两者之间的区别。