RESTful编程到底是什么?
当前回答
Edit
阅读这里的自述文件,我希望你真的能得到REST。
https://github.com/lukepuplett/surfdude-csharp/blob/master/README.md
--
这些给出链接资源示例的答案很好,但只占一半。
所以,想象你正在设计一个网站。你写一个故事,
我希望能够通过邮政编码搜索地址,以便选择发货地址
然后,您将构建网站,让用户踏上旅程,并尝试在工作流中将页面链接在一起。
一个网站设计让他们进行地址查找,然后让他们将地址复制到剪贴板,然后返回到发货地址表单,这是不太有用的。
REST API使用我们在web上认为理所当然的模式进行机器-机器交互。
对邮政编码功能的搜索不应该是base/addresss/{postcode},并且会返回一个集合,即使每个地址都链接到一个完整的地址和一些编辑链接,因为这是一个死胡同;API使用者需要猜测如何使用该地址。
相反,该功能的动机应内置于其使用的流程中,以便旅程在开始时结束:
1 GET /orders/123/shipping
200 OK { Current shipping details + link to parent + link to address picker }
2 -> GET /orders/123/shipping/addresspicker
200 OK { Link and form for searching for a postcode }
3 -> GET /orders/123/shipping/addresspicker?postcode=tn11tl
200 OK { List of addresses each with link to pick it }
4 -> POST /orders/123/shipping/addresspicker?postcode=tn11tl&pickNo=3
200 OK { Current shipping details + link to parent + link to address picker }
这是一次用户旅程,最后您可以看到流量对订单的影响。
HTTP请求/响应严格来说不是REST的一部分,但我认为没有人见过非HTTP REST应用程序。
现在这些URL可以是任何一组字符,它们只是标识符,我把它们做得很漂亮,因为它们对人们来说很有意义。机器将使用rel来计算它们做什么,而不依赖于可读的href。
其他回答
这是我对REST的基本概述。我试图演示RESTful架构中每个组件背后的思想,以便更直观地理解概念。希望这有助于为某些人揭开REST的神秘面纱!
REST(代表性状态转移)是一种设计架构,它概述了网络资源(即共享信息的节点)的设计和寻址方式。一般来说,RESTful体系结构使得客户端(请求机器)和服务器(响应机器)可以请求读取、写入和更新数据,而客户端不必知道服务器是如何操作的,并且服务器可以在不需要了解客户端的任何信息的情况下将数据传递回去。好吧,酷。。。但我们如何在实践中做到这一点?
最明显的要求是需要有某种通用语言,以便服务器可以告诉客户端它正在尝试如何处理请求,并让服务器做出响应。但是,要找到任何给定的资源,然后告诉客户该资源所在的位置,需要有一种指向资源的通用方法。这就是通用资源标识符(URI)的作用;它们基本上是查找资源的唯一地址。
但REST架构并没有就此结束!虽然以上内容满足了我们所需的基本需求,但我们也希望拥有一个支持高流量的体系结构,因为任何给定的服务器通常都会处理来自多个客户端的响应。因此,我们不想让服务器记住以前请求的信息,从而使服务器不堪重负。
因此,我们施加了一个限制,即客户端和服务器之间的每个请求-响应对都是独立的,这意味着服务器不必记住以前的请求(客户端-服务器交互的以前状态)来响应新请求。这意味着我们希望我们的交互是无状态的。为了进一步减轻我们的服务器因重做最近已为给定客户端完成的计算而承受的压力,REST还允许缓存。基本上,缓存意味着对提供给客户端的初始响应进行快照。如果客户端再次发出相同的请求,服务器可以向客户端提供快照,而不是重做创建初始响应所需的所有计算。但是,由于它是一个快照,如果快照尚未过期(服务器提前设置了过期时间),并且响应自初始缓存以来已更新(即请求将给出与缓存响应不同的答案),则客户端将不会看到更新,直到缓存过期(或缓存被清除),并且再次从头开始呈现响应。关于RESTful架构,最后一件事是它们是分层的。实际上,我们已经在讨论客户端和服务器之间的交互时隐式地讨论了这个需求。基本上,这意味着我们系统中的每个层只与相邻层交互。因此,在我们的讨论中,客户端层与服务器层交互(反之亦然),但可能有其他服务器层帮助主服务器处理客户端不直接通信的请求。相反,服务器根据需要传递请求。
现在,如果所有这些听起来都很熟悉,那就太好了。超文本传输协议(HTTP)定义了通过万维网的通信协议,它是RESTful架构抽象概念的一种实现(如果你像我一样是OOP狂热者,则是抽象REST类的实现)。在REST的这个实现中,客户端和服务器通过GET、POST、PUT、DELETE等进行交互,这些都是通用语言的一部分,可以使用URL指向资源。
REST是一种编写分布式应用程序的架构模式和风格。它不是狭义的编程风格。
说你使用REST风格类似于说你建造了一个特定风格的房子:例如都铎风格或维多利亚风格。REST作为一种软件风格,都铎或维多利亚风格作为一种家居风格,都可以通过构成它们的质量和约束来定义。例如,REST必须具有客户端-服务器分离,其中消息是自我描述的。都铎风格的房屋有重叠的山墙和屋顶,这些山墙和前面的山墙陡峭倾斜。您可以阅读Roy的论文,以了解更多关于构成REST的约束和质量的信息。
与家庭风格不同的REST在持续和实际应用中遇到了困难。这可能是故意的。将其实际实现留给设计者。所以你可以自由地做你想做的事情,只要你满足论文中提出的约束条件,你就可以创建REST系统。
奖金:
整个web都基于REST(或REST基于web)。因此,作为一名web开发人员,您可能需要意识到这一点,尽管编写好的web应用程序并不必要。
老问题,新的回答方式。关于这个概念有很多误解。我总是努力记住:
结构化URL和Http方法/动词不是restful编程。JSON不是restful编程RESTful编程不适用于API
我将restful编程定义为
如果应用程序以客户端理解的媒体类型提供资源(是数据+状态转换控件的组合),则该应用程序是静止的
要成为一个安静的程序员,您必须尝试构建允许参与者做事的应用程序。不仅仅是公开数据库。
只有当客户端和服务器同意资源的媒体类型表示时,状态转换控制才有意义。否则,无法知道什么是控件,什么不是控件,以及如何执行控件。IE如果浏览器不知道html中的<form>标签,那么在浏览器中就没有什么可以提交到过渡状态。
我不想自我推销,但我在演讲中深入阐述了这些想法http://techblog.bodybuilding.com/2016/01/video-what-is-restful-200.html .
我演讲中的一段摘录是关于经常提到的richardson成熟度模型,我不相信这些级别,你要么是RESTful(级别3),要么不是,但我想指出的是,在你走向RESTful的过程中,每个级别都为你做了什么
如果我不得不将关于REST的原始论文缩减为短短的3句话,我认为以下内容抓住了它的精髓:
通过URL请求资源。协议仅限于使用URL进行通信的内容。元数据作为名称-值对(发布数据和查询字符串参数)传递。
之后,很容易陷入关于适应、编码约定和最佳实践的争论。
有趣的是,本文中没有提到HTTPPOST、GET、DELETE或PUT操作。这一定是后来有人对“统一界面”的“最佳实践”的解释。
当涉及到web服务时,我们似乎需要一些方法来区分WSDL和基于SOAP的体系结构,这会给接口增加相当大的开销和不必要的复杂性。它们还需要额外的框架和开发人员工具才能实现。我不确定REST是否是区分常识接口和过度工程化接口(如WSDL和SOAP)的最佳术语。但我们需要一些东西。
我认为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中一个经常被忽视的部分是大多数动词的幂等性。这导致了健壮的系统和语义精确解释之间的相互依赖性降低。
推荐文章
- 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服务差异
- 单页应用:优点和缺点