RESTful编程到底是什么?
当前回答
这是一种编程,您的系统架构符合Roy Fielding在论文中提出的REST风格。由于这是描述网络的架构风格(或多或少),所以很多人都对它感兴趣。
另外一个答案是:没有。除非你是作为学术研究软件架构或设计web服务,否则真的没有理由听过这个词。
其他回答
答案很简单,罗伊·菲尔丁写了一篇论文。]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年,我们最终被天网终止。在此之前…;-)
剩下的一点是,如果我们同意对基本操作使用通用语言(http动词),那么可以配置基础结构来理解它们并适当地优化它们,例如,通过使用缓存头在所有级别实现缓存。
通过正确实现的restful GET操作,信息来自服务器的DB、服务器的memcache、CDN、代理的缓存、浏览器的缓存或浏览器的本地存储都无关紧要。可以使用最快、最容易获得的最新来源。
说Rest只是语法上的改变,从使用带有动作参数的GET请求到使用可用的http动词,这看起来没有任何好处,而且纯粹是修饰。重点是使用一种可以被链的每个部分理解和优化的语言。如果GET操作有副作用,则必须跳过所有HTTP缓存,否则结果将不一致。
REST==HTTP类比是不正确的,除非你不强调它“必须”是HATEOAS驱动的。
罗伊自己在这里清除了它。
输入REST API时,除了初始URI(书签)和适用于预期受众的一组标准化媒体类型(即,预期任何可能使用该API的客户端都能理解)之外,不应有任何先验知识。从那时起,所有应用程序状态转换都必须由客户端选择服务器提供的选择来驱动,这些选择出现在接收的表示中,或者由用户对这些表示的操作来暗示。转换可以由客户端对媒体类型和资源通信机制的知识来确定(或限制),这两者都可以动态地改进(例如,按需编码)。
[这里的失败意味着带外信息正在驱动交互,而不是超文本。]
我认为restful的要点是将状态分离到更高的层,同时将互联网(协议)用作无状态传输层。大多数其他方法都会混淆。
这是处理互联网时代编程的根本变化的最佳实用方法。关于根本性的变化,Erik Meijer在这里就表演进行了讨论:http://www.infoq.com/interviews/erik-meijer-programming-language-design-effects-purity#view_93197 . 他将其概括为五种效果,并通过将解决方案设计成编程语言来提出解决方案。该解决方案也可以在平台或系统级别实现,无论使用何种语言。restful可以被视为在当前实践中非常成功的解决方案之一。
使用restful风格,您可以在不可靠的互联网上获取和操纵应用程序的状态。如果当前操作无法获得正确的当前状态,则需要零验证原则来帮助应用程序继续。如果它无法操纵状态,它通常使用多个确认阶段来保持正确。从这个意义上讲,rest本身并不是一个完整的解决方案,它需要web应用程序堆栈的其他部分中的功能来支持其工作。
鉴于这个观点,rest风格并没有真正与互联网或web应用程序绑定。这是许多编程情况的基本解决方案。它也不简单,它只是让界面变得非常简单,并且可以很好地处理其他技术。
只有我的2厘米。
编辑:两个更重要的方面:
无国籍是一种误导。它与restful API有关,而不是应用程序或系统。系统需要有状态。Restful设计是基于无状态API设计有状态系统。另一位QA的一些引用:REST对资源表示进行操作,每个资源表示由URL标识。这些通常不是数据对象,而是复杂的对象抽象。REST代表“代表性状态转移”,这意味着它是关于通信和修改系统中某些资源的状态的。幂等性:REST中一个经常被忽视的部分是大多数动词的幂等性。这导致了健壮的系统和语义精确解释之间的相互依赖性降低。
REST定义了6个体系结构约束,使任何web服务都成为真正的RESTful API。
统一接口客户端-服务器无国籍的可缓存的分层系统按需编码(可选)
https://restfulapi.net/rest-architectural-constraints/
推荐文章
- ReferenceError: description没有定义NodeJs
- REST API - dto还是不是?
- OData和REST web服务的区别
- Symfony 2.x中的所有东西都应该捆绑吗?
- 用Spring我可以做一个可选的路径变量吗?
- 什么是HTTP“主机”报头?
- 用Python构建最小的插件架构
- 哪个HTTP状态代码表示“尚未准备好,稍后再试”?
- Django REST框架:向ModelSerializer添加额外字段
- 如何阻止恶意代码欺骗“Origin”报头来利用CORS?
- 模式、表和数据库之间的区别是什么?
- 为什么说“HTTP是无状态协议”?
- 我需要HTTP GET请求的内容类型报头吗?
- REST和RPC之间的Web服务差异
- 单页应用:优点和缺点