什么是REST?有点困惑。

175
我原本认为REST是一个网络服务,但似乎我的想法是错误的 - 那么,REST是什么呢?
我已经阅读了维基百科,但仍然无法完全理解。为什么很多地方都将API称为REST API?

26
这怎么可能是一个重复的问题?另一个人显然知道REST是什么,而Nathan则感到困惑。 - Fake Code Monkey Rashid
1
我觉得其他人会回答他的问题。如果没有其他人同意,那么关闭投票将会过期。我们对这个问题有大约十个答案。只需点击“rest”标签,您就可以看到它们全部了。 - John Saunders
2
REST是一组用于构建Web服务的规则。如果API按照这些规则构建,则它是一个REST API。《如何向我的橡皮鸭子解释REST》(How I explained REST to my rubber duck)在非正式场合下解释了其中的一些规则。 - User42
5个回答

142

REST不是一个具体的网络服务,而是一种管理状态信息的设计概念(架构)。这方面的里程碑论文是Roy Thomas Fielding的博士论文(2000年),题为“基于网络的软件架构的体系结构风格和设计”(可从加州大学尔湾分校在线获取,链接)。

首先阅读Ryan Tomayko的文章《我如何向妻子解释REST》;这是一个很好的起点。然后阅读Fielding的真正的博士论文。这并不复杂,也不长(六章,180页)!(我知道你们学校的孩子喜欢简短明了)。

编辑:我觉得尝试解释REST是没有意义的。它有太多的概念,如可扩展性、可见性(无状态)等等,读者需要理解,最好的理解来源是实际的博士论文。这远不止于POST / GET等。


当开发人员尝试使用REST并仅在其代码上执行它(而没有考虑整个系统的REST设计),那么就会遇到麻烦 :-) - karatedog
@Nathan,REST是一种可以用作Web服务的架构风格。由于它是一种架构风格而不是规范,因此它也可以用于其他事情! RESTful WS和非RESTful WS之间的区别在于,例如,RESTful WS在服务器和客户端之间的通信中需要是“无状态”的(请查阅)。虽然SOAP主要使用XML作为其格式,但从RESTful Web服务中,您应该能够请求几乎任何格式(您不需要支持许多格式),但如果不支持,则应能够处理客户端(HTTP 415)。 - Anders
@Anders:您已删除了帖子中提到的链接。有没有其他地方我可以阅读它? - user961954
7
明白了 http://web.archive.org/web/20080429231452/http://tomayko.com/writings/rest-to-my-wife - user961954
1
也许阅读这一章就足以代替阅读整篇论文了:http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm - andilabs
显示剩余2条评论

85

REST是一种软件设计模式,通常用于Web应用程序。通俗地说,这意味着它是许多不同项目中广泛使用的想法。它代表REpresentational State Transfer。 REST的基本思想是将服务器端的对象(例如数据库表中的行)视为可以创建或销毁的资源。

最基本的理解REST的方法是格式化您的Web应用程序URL的方法。例如,如果您的资源称为“帖子”,那么:

/posts 是用户访问所有帖子用于显示的方式。

/posts/:id 是用户根据其唯一ID检索和查看单个帖子的方式。

/posts/new 是您显示用于创建新帖子的表单的方式。

/users发送POST请求是创建新帖子的方式。

/users/:id发送PUT请求是更新给定帖子属性的方式,再次通过唯一ID进行识别。

/users/:id发送DELETE请求是删除给定帖子的方式,也是通过唯一ID进行识别。

据我所知,REST模式主要是由Ruby on Rails框架推广(面向Web应用程序),该框架非常注重RESTful路线。尽管我可能错了。

我可能不是最合格的人来谈论它,但这是我学习它的方式(特别是针对Rails开发)。

当有人提到“REST API”时,通常他们所指的是使用RESTful URL检索数据的API。


2
你很幸运,因为Rails是建立在REST原则之上的,如果你使用Rails工具,你的代码将是符合RESTful标准的。然而,有些程序员并不理解REST,他们随心所欲地编写代码,并最终利用这种“URL格式化”方式,因为它很时髦。 - karatedog
10
在这个答案中,无论何处使用了“/users”,都应该改为“/posts”吗? - Mayuresh Srivastava
@MayureshSrivastava 注意到PUT示例有:id,而POST示例没有:id。谷歌搜索剩下的内容。(POST: 非安全、非幂等; PUT: 非安全、幂等) - Ajeet Ganga

44

REST是一种基于网络的软件架构的设计风格

REST概念被称为资源。资源的表示必须是无状态的,并通过某种媒体类型进行表示。一些媒体类型的例子包括XMLJSONRDF。组件操作资源。组件通过标准统一接口请求和操作资源。在HTTP的情况下,此接口由标准HTTP操作(例如GETPUTPOSTDELETE)组成。

REST通常使用HTTP,主要是由于HTTP的简单性及其与RESTful原则的非常自然的映射。但是,REST并不绑定到任何特定协议。

基本REST原则

客户端-服务器通信

客户端-服务器架构具有非常明显的关注点分离。所有以RESTful风格构建的应用程序也必须基于客户端-服务器原则。

无状态

每个客户端请求服务器都需要完全表示其状态。服务器必须能够完全理解客户端请求,而不使用任何服务器上下文或服务器会话状态。因此,所有状态都必须保留在客户端上。稍后我们将更详细地讨论无状态表示。
可缓存性
可以使用缓存约束,从而使响应数据标记为可缓存或不可缓存。任何标记为可缓存的数据都可以作为相同后续请求的响应被重复使用。
统一接口
所有组件都必须通过单个统一接口进行交互。因为所有组件交互都是通过该接口进行的,所以与不同服务的交互非常简单。接口是相同的!这也意味着可以孤立地进行实现更改。这样的更改不会影响基本组件交互,因为统一接口始终不变。一个缺点是你被限制于接口。如果通过更改接口可以为特定服务提供优化,那么REST就不允许了。然而,好的方面是,REST针对Web进行了优化,因此REST在HTTP上的流行度非常高!
以上概念代表了REST的定义特征,并将REST架构与其他架构(如Web服务)区分开来。值得注意的是,REST服务是Web服务,但Web服务不一定是REST服务。

查看此博客中关于REST 设计原则post,以获取有关REST和上述原则的更多详细信息。


17
它代表表述性状态转移,通常在讨论API和应用程序时,REST是一种进行Web服务或使程序通过Web交流的方式。REST基本上是一种系统之间通信的方式,可以完成SOAP RPC的大部分功能,但SOAP通常建立连接、验证然后在该连接上执行操作,而REST的工作方式与Web基本相同。您有一个URL,当您请求该URL时,会返回某些内容。这就是事情开始变得混乱的地方,因为人们将Web描述为最大的REST应用程序,虽然从技术上讲这是正确的,但并不能真正解释它是什么。
简而言之,REST允许您使用类似于Web浏览器使用的工具在Internet上让两个应用程序进行交流。这比SOAP简单得多,REST所做的很多工作都是说:“嘿,事情不必那么复杂。”
值得阅读:

REST是一种基于约束条件的架构,SOAP是一种协议,它们完全是两个不同的东西。我不喜欢人们在同一个概念中谈论SOAP和REST,这难怪人们会感到困惑。 - Anders
@Anders - 他说他正在研究REST API,并认为这是使用Web服务的一种方式。您可以像这样使用REST,在这种情况下,它可以实现SOAP所能实现的大部分功能。还可以将Web视为全球最大的RESTful应用程序,但这并不能真正解释您将使用REST API做什么。 - Mark
这实际上一直是我的主要问题,将REST和SOAP视为同一概念。看起来API的设计只是符合RESTful的。 - Prisoner

4

http://en.wikipedia.org/wiki/Representational_State_Transfer

基本思想是,不再与服务器保持持续连接,而是发出请求,获取一些数据,向用户显示这些数据,但可能不是全部,然后当用户需要更多数据或将一些数据传递给服务器时,客户端会启动新状态的更改。


4
也许只有我这么想,但我喜欢在stackoverflow上看到相关答案和适当的引用。请原谅我的幽默感,假设维基百科突然消失了。那你提供的链接还有什么用呢? :) - Fake Code Monkey Rashid
1
@Hack Saw:那不应该在你的答案里吗? - Fake Code Monkey Rashid
我刚刚注意到了编辑功能。 :) - Hack Saw
1
@karatedog:REST 可以通过 HTTP 实现,但也可以使用多种数据传输方法来完成。 - Hack Saw
1
你所写的是HTTP协议,而REST是一种架构。 - karatedog
@Hack Saw:整个REST的理念是基于“资源”并对这些资源进行操作。请问有哪种协议具有与HTTP协议中的URI或URL相同的“资源识别能力”?FTP? - karatedog

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接