RESTful编程到底是什么?


当前回答

交谈不仅仅是交换信息。协议实际上是这样设计的,因此不必进行对话。每一方都知道他们的具体工作是什么,因为它在协议中有所规定。协议允许纯粹的信息交换,而不需要对可能的操作进行任何更改。另一方面,谈话允许一方询问另一方可以采取什么进一步行动。他们甚至可以问同一个问题两次,并得到两个不同的答案,因为另一方的状态可能在这期间发生了变化。对话是RESTful架构。菲尔丁的论文规定了如果一个人想让机器彼此交谈而不是简单地通信,那么他必须遵循的体系结构。

其他回答

这是我对REST的基本概述。我试图演示RESTful架构中每个组件背后的思想,以便更直观地理解概念。希望这有助于为某些人揭开REST的神秘面纱!

REST(代表性状态转移)是一种设计架构,它概述了网络资源(即共享信息的节点)的设计和寻址方式。一般来说,RESTful体系结构使得客户端(请求机器)和服务器(响应机器)可以请求读取、写入和更新数据,而客户端不必知道服务器是如何操作的,并且服务器可以在不需要了解客户端的任何信息的情况下将数据传递回去。好吧,酷。。。但我们如何在实践中做到这一点?

最明显的要求是需要有某种通用语言,以便服务器可以告诉客户端它正在尝试如何处理请求,并让服务器做出响应。但是,要找到任何给定的资源,然后告诉客户该资源所在的位置,需要有一种指向资源的通用方法。这就是通用资源标识符(URI)的作用;它们基本上是查找资源的唯一地址。

但REST架构并没有就此结束!虽然以上内容满足了我们所需的基本需求,但我们也希望拥有一个支持高流量的体系结构,因为任何给定的服务器通常都会处理来自多个客户端的响应。因此,我们不想让服务器记住以前请求的信息,从而使服务器不堪重负。

因此,我们施加了一个限制,即客户端和服务器之间的每个请求-响应对都是独立的,这意味着服务器不必记住以前的请求(客户端-服务器交互的以前状态)来响应新请求。这意味着我们希望我们的交互是无状态的。为了进一步减轻我们的服务器因重做最近已为给定客户端完成的计算而承受的压力,REST还允许缓存。基本上,缓存意味着对提供给客户端的初始响应进行快照。如果客户端再次发出相同的请求,服务器可以向客户端提供快照,而不是重做创建初始响应所需的所有计算。但是,由于它是一个快照,如果快照尚未过期(服务器提前设置了过期时间),并且响应自初始缓存以来已更新(即请求将给出与缓存响应不同的答案),则客户端将不会看到更新,直到缓存过期(或缓存被清除),并且再次从头开始呈现响应。关于RESTful架构,最后一件事是它们是分层的。实际上,我们已经在讨论客户端和服务器之间的交互时隐式地讨论了这个需求。基本上,这意味着我们系统中的每个层只与相邻层交互。因此,在我们的讨论中,客户端层与服务器层交互(反之亦然),但可能有其他服务器层帮助主服务器处理客户端不直接通信的请求。相反,服务器根据需要传递请求。

现在,如果所有这些听起来都很熟悉,那就太好了。超文本传输协议(HTTP)定义了通过万维网的通信协议,它是RESTful架构抽象概念的一种实现(如果你像我一样是OOP狂热者,则是抽象REST类的实现)。在REST的这个实现中,客户端和服务器通过GET、POST、PUT、DELETE等进行交互,这些都是通用语言的一部分,可以使用URL指向资源。

REST代表代表性状态转移。

它依赖于一个无状态的、客户端-服务器的、可缓存的通信协议——实际上在所有情况下都使用HTTP协议。

REST通常用于移动应用程序、社交网络网站、mashup工具和自动化业务流程。REST风格强调通过有限数量的操作(动词)来增强客户端和服务之间的交互。通过将资源(名词)分配给它们自己独特的通用资源指示符(URI)来提供灵活性。

休息介绍

这在任何地方都很少被提及,但Richardson的成熟度模型是实际判断Restful是API的最佳方法之一。更多信息请点击此处:

理查德森成熟度模型

剩下的一点是,如果我们同意对基本操作使用通用语言(http动词),那么可以配置基础结构来理解它们并适当地优化它们,例如,通过使用缓存头在所有级别实现缓存。

通过正确实现的restful GET操作,信息来自服务器的DB、服务器的memcache、CDN、代理的缓存、浏览器的缓存或浏览器的本地存储都无关紧要。可以使用最快、最容易获得的最新来源。

说Rest只是语法上的改变,从使用带有动作参数的GET请求到使用可用的http动词,这看起来没有任何好处,而且纯粹是修饰。重点是使用一种可以被链的每个部分理解和优化的语言。如果GET操作有副作用,则必须跳过所有HTTP缓存,否则结果将不一致。

答案很简单,罗伊·菲尔丁写了一篇论文。]1在那篇论文中,他定义了REST原则。如果应用程序满足所有这些原则,那么这就是REST应用程序。

之所以创建RESTful一词,是因为ppl通过将其非REST应用程序称为REST而耗尽了REST一词。此后,RESTful一术语也耗尽了。现在我们讨论的是Web API和超媒体API,因为大多数所谓的REST应用程序都没有实现统一接口约束的HATEOAS部分。

REST约束如下:

客户端-服务器体系结构因此,它不适用于例如PUB/SUB套接字,而是基于REQ/REP。无状态通信因此,服务器不维护客户端的状态。这意味着您不能使用服务器侧会话存储,并且必须对每个请求进行身份验证。您的客户端可能通过加密连接发送基本身份验证标头。(对于大型应用程序,很难维护许多会话。)如果可以,请使用缓存因此,您不必一次又一次地满足相同的请求。作为客户机和服务器之间通用契约的统一接口客户端和服务器之间的契约不由服务器维护。换句话说,客户端必须与服务的实现分离。您可以通过使用标准解决方案来达到这种状态,例如用于标识资源的IRI(URI)标准、用于交换消息的HTTP标准、用于描述消息体序列化格式的标准MIME类型、用于描述邮件体不同部分语义的元数据(可能是RDF vocabs、微格式等)。为了将IRI结构与客户端分离,必须以超媒体格式(HTML、JSON-LD、HAL等)向客户端发送超链接。因此,客户端可以使用分配给超链接的元数据(可能是链接关系、RDF vocabs),通过适当的状态转换来导航应用程序的状态机,以实现其当前目标。例如,当客户想要向网络商店发送订单时,必须检查网络商店发送的响应中的超链接。通过检查链接,可以找到http://schema.org/OrderAction.客户机知道schema.org vocab,因此它知道通过激活这个超链接,它将发送订单。因此它激活超链接并发送POSThttps://example.com/api/v1/order以恰当的方式传递信息。之后,服务处理消息并以具有正确HTTP状态标头的结果进行响应,例如201-由成功创建。为了用详细的元数据注释消息,标准解决方案使用RDF格式,例如JSON-LD和REST vocab,例如Hydra和领域特定vocab(如schema.org或任何其他链接数据vocab),如果需要,还可以使用定制的应用程序特定vocab。现在这并不容易,这就是为什么大多数应用程序使用HAL和其他简单格式,这些格式通常只提供REST vocab,但不提供链接数据支持。构建分层系统以提高可扩展性REST系统由层次结构层组成。每一层包含使用下一层组件的服务的组件。因此,您可以轻松添加新的图层和组件。例如,有一个包含客户端的客户端层,在该层之下有一个服务层,该服务层包含单个服务。现在,您可以在它们之间添加客户端缓存。之后,您可以添加另一个服务实例和负载平衡器等…客户端代码和服务代码不会更改。扩展客户端功能的按需代码此约束是可选的。例如,您可以向客户端发送特定媒体类型的解析器,等等…为了做到这一点,您可能需要客户端中的标准插件加载器系统,或者您的客户端将耦合到插件加载器解决方案。

REST约束导致了一个高度可扩展的系统,其中客户端与服务的实现分离。因此,客户端可以是可重用的,就像web上的浏览器一样。客户机和服务共享相同的标准和语音,因此尽管客户机不知道服务的实现细节,但它们可以相互理解。这使得创建能够找到并利用REST服务实现其目标的自动化客户端成为可能。从长远来看,这些客户端可以像人类一样相互通信,在任务上相互信任。如果我们向这些客户端添加学习模式,那么结果将是一个或多个使用机器网络的人工智能,而不是一个服务器园区。因此,伯纳斯-李的梦想终于实现了:语义网络和人工智能将成为现实。因此,到2030年,我们最终被天网终止。在此之前…;-)