这就是我对REST架构的看法.
对于每个资源,都有一个唯一的URI.
我们可以使用它的URI和HTTP动作[POST,GET,PUT和DELETE]来操纵该对象.HTTP请求传输该对象状态的表示.
在我读过的所有文本中,REST都以一种奇怪而混乱的方式解释.
还有一件事,rails中的RESTFUL实现为不同的目的产生不同的url.喜欢/团队 - >'索引'方法... /团队/新 - >'新'方法等等.这不是离开休息,它定义每个资源都有一个唯一的URI ???
我认为你对REST的理解非常好.它不需要比它应该更复杂.@Surya也概述了一些非常好的观点.
Rails将HTTP方法映射到控制器方法的方式是:
GET => show PUT => update POST => create DELETE => destroy
rails提供的另外两种资源/方法即:
resource/new => new resource/edit => edit
很可能不是用于所有实际目的的资源,但是用于构建网页和应用程序是必需的.如果客户端完全了解资源,则不需要这些资源.客户端可以使用资源信息进行调用POST
和PUT
调用,并根据需要创建或更新资源.但是,由于不希望用户知道资源的来龙去脉,因此需要更简单的界面来创建或更新.
如果所有用户都完全了解资源并且熟悉命令行,我们甚至不需要HTML.他们可以curl
在与这些资源的互动中:)
index
只是让它更容易使用集合.例如,它仍然是一个定义良好的资源,并具有唯一的表示/books
.如何在服务器端代码处理它没有成功RESTless
(我只是做了,但它真棒).
我将从罗伊菲尔丁的论文第5章开始.有几个基本原则:
资源:资源通常可以作为服务的一部分向外部世界公开.重点是识别资源(例如:Book,UserList,CalculateDistance)
URI:为每个资源提供标识符(例如:example.com/books/7654)
统一接口:使用GET,PUT等标准方法.POST,DELETE,HEAD,OPTIONS
表示:资源可以有多个表示.例如,书上的GET可以返回该书内容的PDF,内容的HTML,甚至是带有书籍封面的GIF等等.表示本质上是所有数据和标记的集合.
超媒体:在我看来,这是一个非常重要的原则.这个原则的实现使您的应用程序远远领先于REST样式的常规CRUD定义.HATEOAS是超媒体作为应用程序状态引擎的首字母缩写.当您单击链接或提交表单时,您正在更改应用程序的状态,这是通过超链接(或超媒体)进行的.服务器和客户端之间的耦合很少.客户端通过服务器提供的链接浏览应用程序.(在这个原则的博客圈里有很多讨论...)[另见Restfulie ]
我最近回答了关于学习REST的良好资源的问题,可能会有所帮助.
我不熟悉Rails,所以不解决问题的这一部分.
这是我对REST的基本概述。我试图证明RESTful架构中每个组件背后的想法,以便使理解概念更为直观。希望这有助于使REST神秘化!
REST(代表性状态转移)是一种设计体系结构,概述了网络资源(即共享信息的节点)的设计和寻址方式。通常,RESTful体系结构使其可以使客户端(请求计算机)和服务器(响应计算机)可以请求读取,写入和更新数据,而客户端不必知道服务器的运行方式和服务器可以通过它不需要知道客户端的任何信息。好的,很酷...但是我们如何在实践中做到这一点?
最明显的要求是,需要某种通用语言,以便服务器可以告诉客户端它正在尝试处理请求并让服务器响应。
但是要找到任何给定的资源然后告诉客户该资源在哪里,就需要一种通用的指向资源的方式。这就是通用资源标识符(URI)的来源。它们基本上是查找资源的唯一地址。
但是REST架构还不止于此!尽管以上内容满足了我们所需的基本需求,但我们也希望拥有一种支持高流量的体系结构,因为任何给定的服务器通常都处理来自多个客户端的响应。因此,我们不想让服务器记住有关先前请求的信息而使服务器不堪重负。
因此,我们施加了以下限制:客户端和服务器之间的每个请求-响应对都是独立的,这意味着服务器不必记住有关先前请求(客户端-服务器交互的先前状态)的任何内容即可响应新请求。请求。这意味着我们希望我们的交互是无状态的。
为了进一步减轻服务器上的负担,使其无法重做最近针对给定客户端进行的计算,REST还允许进行缓存。基本上,缓存是指对提供给客户端的初始响应进行快照。如果客户端再次发出相同的请求,则服务器可以为客户端提供快照,而不是重做创建初始响应所需的所有计算。但是,由于它是快照,因此如果快照尚未过期(服务器预先设置了过期时间),并且响应自初始缓存以来已更新(即,请求将给出与缓存响应不同的答案) ,客户端将看不到更新,直到缓存过期(或清除缓存)并且再次从头开始呈现响应。
关于RESTful架构,您经常会碰到的最后一件事是它们是分层的。在讨论客户端和服务器之间的交互时,我们实际上已经在隐式讨论此要求。基本上,这意味着我们系统中的每一层仅与相邻层交互。因此,在我们的讨论中,客户端层与服务器层交互(反之亦然),但是可能还有其他服务器层可以帮助主服务器处理客户端不直接与之通信的请求。而是服务器根据需要传递请求。
现在,如果所有这些听起来都很熟悉,那就太好了。超文本传输协议(HTTP),它定义了通过万维网的通信协议,是RESTful体系结构抽象概念的实现(如果您是像我这样的OOP狂热者,则可以是REST类的实例)。在REST的此实现中,客户端和服务器通过GET,POST,PUT,DELETE等进行交互,它们是通用语言的一部分,可以使用URL指向资源。