RESTful编程到底是什么?
当前回答
RESTful(代表性状态转移)API编程是通过以下5个基本的软件架构风格原则,以任何编程语言编写web应用程序:
资源(数据、信息)。唯一的全局标识符(所有资源都由URI标识)。统一接口-使用简单标准接口(HTTP)。表示-所有通信都是通过表示(例如XML/JSON)完成的无状态(每个请求都是在完全隔离的情况下发生的,这样更容易缓存和负载平衡),
换句话说,您正在通过HTTP编写简单的点对点网络应用程序,该应用程序通过实现RESTful架构使用GET、POST、PUT或DELETE等动词,该架构提出了每个“资源”公开的接口的标准化。以一种简单有效的方式(高度成功、经过验证和分布式架构)使用web的当前特性并不重要。它是SOAP、CORBA和RPC等更复杂机制的替代方案。
RESTful编程符合Web体系结构设计,如果实现得当,它允许您充分利用可扩展的Web基础设施。
其他回答
什么是REST?
用官方的话说,REST是一种基于使用当前“Web”基础的特定原则构建的架构风格。web有5个基本基础,可用于创建REST服务。
原则1:一切都是资源在REST体系结构风格中,数据和功能被视为资源,并使用统一资源标识符(URI)(通常是Web上的链接)进行访问。原则2:每个资源都由唯一标识符(URI)标识原则3:使用简单统一的接口原则4:通过代表进行沟通原则5:无状态
我会说,RESTful编程是关于创建遵循REST体系结构风格的系统(API)。
我发现M.Elkstein博士的这篇关于REST的精彩、简短且易于理解的教程,并引用了最能回答您问题的重要部分:
学习REST:教程
REST是一种用于设计网络应用程序的架构风格。其思想是,使用RPC或SOAP连接机器,使用简单的HTTP机器之间的呼叫。在许多方面,基于HTTP的万维网本身可以被视为基于REST的架构。RESTful应用程序使用HTTP请求来发布数据(创建和/或更新)、读取数据(例如进行查询)和删除数据。因此,REST对所有四个CRUD(创建/读取/更新/删除)操作使用HTTP。
我认为你不应该因为没有听到堆栈溢出之外的REST而感到愚蠢。。。,我也会遇到同样的情况!;另一个SO问题“为什么REST现在变得越来越大”的答案可能会缓解一些情绪。
这是一种编程,您的系统架构符合Roy Fielding在论文中提出的REST风格。由于这是描述网络的架构风格(或多或少),所以很多人都对它感兴趣。
另外一个答案是:没有。除非你是作为学术研究软件架构或设计web服务,否则真的没有理由听过这个词。
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。
RESTful编程是关于:
资源由持久标识符标识:URI是当今普遍使用的标识符使用一组常见的动词来操纵资源:HTTP方法是常见的情况-古老的Create、Retrieve、Update、Delete变为POST、GET、PUT和Delete。但REST并不局限于HTTP,它只是目前最常用的传输。为资源检索的实际表示取决于请求,而不是标识符:使用Accept标头来控制是否需要XML、HTTP,甚至是表示资源的Java对象保持对象中的状态并在表示中表示状态在资源表示中表示资源之间的关系:对象之间的链接直接嵌入到表示中资源表示描述了如何使用表示,以及在什么情况下应该以一致的方式丢弃/重新处理表示:HTTP缓存控制头的使用
最后一个可能是REST的后果和整体有效性方面最重要的。总体而言,大多数RESTful讨论似乎都集中在HTTP及其在浏览器中的使用上。我知道R.Fielding在描述导致HTTP的架构和决策时创造了这个术语。他的论文更多的是关于资源的体系结构和缓存能力,而不是HTTP。
如果你真的对RESTful架构是什么以及它为什么工作感兴趣,请读几遍他的论文,并阅读整个内容,而不仅仅是第5章!接下来看看DNS为什么工作。阅读DNS的分级组织以及转介的工作原理。然后阅读并考虑DNS缓存的工作原理。最后,阅读HTTP规范(尤其是RFC2616和RFC3040),并考虑高速缓存的工作方式及其原因。最终,它只会咔嚓一声。当我看到DNS和HTTP之间的相似性时,我得到了最后的启示。在这之后,了解SOA和消息传递接口是可伸缩的就开始了。
我认为,要理解RESTful和SharedNothing架构的架构重要性和性能含义,最重要的技巧是避免被技术和实现细节所困扰。关注谁拥有资源,谁负责创建/维护资源等。然后思考表示、协议和技术。
推荐文章
- 有没有REST api的命名规范指南?
- 由Jon Skeet撰写的《Singleton》澄清
- 什么是HTTP中的“406-不可接受的响应”?
- 最好的轻量级web服务器(只有静态内容)的Windows
- HTTP POST在Java中使用JSON
- 哪些HTTP方法与哪些CRUD方法相匹配?
- 使用HTML形式的PUT方法
- 如何转义哈希字符在URL
- RESTful服务中部分更新的最佳实践
- JAX-RS / Jersey如何自定义错误处理?
- 有没有办法在python中做HTTP PUT
- 我能在服务器端应用程序(PHP、Ruby、Python等)上读取URL的哈希部分吗?
- 如何POST表单数据与Spring RestTemplate?
- 什么是http头“X-XSS-Protection”?
- 在nodejs http中body在哪里。得到回应?