HTTP和REST有什么区别?

456

在阅读了大量有关REST与SOAP之间差异的内容后,我得出了REST只是HTTP的另一种说法的印象。有人可以解释下REST为HTTP添加了哪些功能吗?

注意:我不需要比较REST和SOAP。


62
作为一个侧面的注释,现在你听到的关于REST的炒作大概有90%是来自那些并没有真正理解REST全貌的人。不幸的是,REST已经成为了一种销售用语。你必须穿过很多垃圾才能发现真正的好处。 - Darrel Miller
9
REST 受到热捧可能是因为人们对 SOAP 感到非常恼火。大家都很高兴能够摆脱 SOAP 地狱 :D - aefxx
71
把HTTP比作游戏用的球,REST则是像足球这样的特定游戏。有些人会说足球是最好的游戏,而其他人则可能不同意。为什么REST应该有自己的术语呢?因为把所有球类游戏都叫做“球类游戏”无法确定你使用的规则集是哪个。这样一来,大家就可以按照同样的标准(抱歉,打了个比方)来阅读内容了。 - Ross Drew
6
现在我们有另一个选项GraphQL,与REST相比。两者都使用HTTP。 - Hongbo Miao
4
@RossDrew的比喻很棒,它使理解更加容易。 - Anoop
显示剩余2条评论
13个回答

338
不,REST 是应该使用HTTP的方式。
今天我们只使用了HTTP协议中的一小部分方法,即GETPOST。采用REST的方式是使用协议中的所有方法。
例如,REST规定使用DELETE来删除URI后面的文档(无论是文件、状态等),而在HTTP中,你会误用GETPOST查询,例如:...product/?delete_id=22

36
使用其他方法的主要优势是什么? - Dimitri C.
8
我已经张贴了一个链接,其中包含一个真实世界的例子,可以展示出这些优势。干杯! - aefxx
12
-1 是指错误地将 REST 定义为通过 Web 发送消息的一种方式。REST 实际上是一种架构类型,有关更多信息,请参阅 https://en.wikipedia.org/wiki/Representational_state_transfer。 - Yuval Perelman
6
再次出错了。REST不是HTTP/1.0协议背后的架构原则。RESTful架构要晚得多。HTTP协议提供的功能符合REST架构,但两者并不相互依赖。这不是重新发明轮子的问题,而是要理解这些概念。 - Yuval Perelman
5
@aefxx 谢谢你,我不知道这个内容,也没有看过完整的论文。如果可以的话,我会把踩变成赞。你的辩论方式很有趣,你可以直接给我一个链接就好了。唉。 - Yuval Perelman
显示剩余9条评论

188

HTTP是一种用于通信的协议,通常用于与互联网资源或任何具有Web浏览器客户端的应用程序进行通信。

REST意味着在设计应用程序时使用的主要概念是资源:对于要执行的每个操作,您需要定义一个资源,在该资源上通常仅执行CRUD操作,这是一项简单的任务。为此,非常方便使用HTTP协议中使用的四个动词来执行四个CRUD操作(GET代表读取,POST代表创建,PUT代表更新,DELETE代表删除)。

这与旧的RPC(远程过程调用)概念不同,其中您有一组要执行的操作,作为用户调用的结果。例如,如果您考虑如何描述Facebook上帖子的“赞”,则可以使用RPC创建名为AddLikeToPostRemoveLikeFromPost的服务,并将其与所有其他与FB帖子相关的服务一起管理,因此您不需要为“赞”创建特殊对象。

使用REST,您将拥有一个独立管理的“赞”对象,可使用Delete和Create函数进行管理。这也意味着它将在您的数据库中描述为一个单独的实体。这可能看起来是一个小的差异,但是像那样工作通常会产生更简单的代码和更简单的应用程序。通过这种设计,大多数应用程序的逻辑从对象的结构(模型)中很明显,而RPC通常需要显式添加更多逻辑。

设计RESTful应用程序经常更难,因为它要求您以简单的方式描述复杂的事物。仅使用CRUD函数描述所有功能是棘手的,但在完成后,您的生活会变得更简单,并且您会发现自己编写了更短的方法。

REST 架构还有一个限制,就是不要在与客户端通信时使用会话上下文(无状态),这意味着需要传递所有用于理解客户端身份和需求的信息。每个函数调用都是自描述的,没有可在消息中引用的先前与客户端的对话。因此,客户端不能告诉您“给我下一页”,因为您没有会话来存储前一页和所需页面的信息,客户端必须说“我的名字是Yuval,请获取​​指定论坛帖子的第 2 页”。这意味着在通信中需要传输更多数据,但考虑从“获取下一页”函数与“在 Stack Overflow 中获取问题 ID 2190836 的第 2 页”中找到的错误报告之间的差异。

当然,这只是冰山一角,但就我个人而言,这些是其中的主要概念。


55

REST强制使用可用的HTTP命令,就像它们本来被设计使用的那样。

例如,我可以这样做:

GET
http://example.com?method=delete&item=xxx

但如果是休息,我会使用“DELETE”请求方法,避免使用“method”查询参数的必要性。

DELETE
http://example.com?item=xxx

4
简单的例子,可以节省1000个字。 - user2576266

48

HTTP是一种应用程序协议。REST则是一组规则,遵循这些规则可以构建具有一定可取限制的分布式应用程序。

如果您正在寻找最重要的REST限制,以区别于普通的HTTP应用程序,我会说“自描述”约束和超媒体约束(也称为应用状态的超媒体引擎(HATEOAS))最为重要。

自描述约束要求REST请求在用户意图方面完全自我描述。这使得中间件(代理和缓存)可以安全地对消息进行处理。

HATEOAS约束是将应用程序转换为链接网络的约束,其中客户端的当前状态基于其在该网络中的位置。这是一个棘手的概念,需要更多的时间来解释。


31

HTTP是一种合同,通信协议;REST是一个概念,一种体系结构风格,它可以使用HTTP、FTP或其他通信协议,但通常与HTTP一起使用。

REST蕴含一系列关于服务器和客户端如何交互的约束条件。HTTP是一种具有给定机制的服务器-客户端数据传输通信协议,它在REST API中最常用,仅因为REST受到WWW(万维网)启发,在REST定义之前,WWW广泛使用HTTP,因此使用HTTP实现REST API更容易。

REST有三个主要的约束条件(但还有更多):

  1. 服务器和客户端之间的交互应仅通过超文本来描述。
  2. 服务器和客户端应松散耦合,彼此不应做出任何假设。客户端只需知道资源入口点。交互数据应由服务器在响应中提供。
  3. 服务器不应存储有关请求上下文的任何信息。请求必须是独立且幂等的(即如果无穷重复相同请求,则检索到完全相同结果)

而HTTP只是一种通信协议工具,可帮助实现这一目标。

欲了解更多信息,请查看以下链接:


22

REST = 表述性状态转移

REST是一组规则,遵循这些规则可以构建具有特定一组优秀约束条件的分布式应用程序。

REST是一种协议,用于交换任何(XML、JSON等)消息,并可使用HTTP协议来传输这些消息。

特点:

它是无状态的,理想情况下客户端和服务器之间不应该保持连接。客户端将其上下文传递给服务器,然后服务器可以存储此上下文以处理客户端的进一步请求例如,由客户端传递的会话标识符标识了服务器维护的会话。

无状态的优势:

  1. Web服务可以单独处理每个方法调用。
  2. Web服务无需维护客户端的先前交互。
  3. 这反过来简化了应用程序设计。
  4. HTTP本身是一个无状态协议,与TCP完全不同,因此RESTful Web服务可以与HTTP协议无缝配合使用。

无状态的缺点:

  1. 为保留客户端状态,每个请求需要添加一个额外的头信息层。
  2. 出于安全性考虑,我们需要添加头信息到每个请求。

REST支持的HTTP方法:

GET: /string/someotherstring它是幂等的,并应该在每次调用时返回相同的结果。

PUT:与GET相同。幂等性且用于更新资源。

POST:应包含一个网址和正文,用于创建资源。理想情况下,多个调用应返回不同的结果,并应创建多个产品。

DELETE:用于删除服务器上的资源。

HEAD:

HEAD方法与GET方法完全相同,只是服务器不得在响应中返回消息正文。响应头中包含的元信息应与响应GET请求发送的信息相同。

OPTIONS:

这个方法允许客户端确定与资源相关的选项和/或需求,或者服务器的功能,而不意味着资源操作或启动资源检索。

HTTP响应

请点击此处查看所有响应

以下是一些重要的状态码: 200 - 请求成功 3XX - 需要客户端提供附加信息并进行URL重定向 400 - 错误请求
401 - 未经授权访问
403 - 禁止访问
请求有效,但服务器拒绝采取行动。用户可能没有访问资源的必要权限,或者可能需要某种类型的帐户。

404 - 未找到
所请求的资源无法找到,但将来可能会提供。客户端可以发出后续请求。

405 - 方法不被允许
请求方法不支持所请求的资源;例如,在需要通过POST提交数据的表单上进行GET请求,或在只读资源上进行PUT请求。

500 - 内部服务器错误
502 - 错误的网关


1
我认为这个应该得到更多的赞。 - Rev

14

并不完全是...

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

REST最初是在HTTP的上下文中描述的,但不限于该协议。如果其他应用层协议已经为基于传输有意义的表现状态的应用程序提供了丰富和统一的词汇表,那么RESTful架构可以基于其他应用层协议。 RESTful应用程序最大化使用预先存在的、定义良好的接口和所选网络协议所提供的其他内置功能,并将新的应用程序特定功能附加到其上的数量最小化。

http://www.looselycoupled.com/glossary/SOAP

(简单对象访问协议)Web服务消息的标准。基于XML,SOAP定义了一个信封格式和各种规则来描述其内容。与WSDL和UDDI一起被视为Web服务的三个基础标准之一,它是交换Web服务的首选协议,但并不是唯一的协议;REST的支持者认为它增加了不必要的复杂性。


14
那个提问的人说:“在阅读了很多关于REST和SOAP之间区别的内容之后……” - LiamB

13

REST是一种特定的方法来设计大型系统(例如Web)。

它是一组“规则”(或“约束”)。

HTTP是一种协议,试图遵守这些规则。


1
我认为,如果您将HTTP用作REST服务的传输方式,遵守这些规则就很容易。 - abatishchev

10

来源于你不知道HTTP和REST之间的区别

因此,REST架构和HTTP 1.1协议是相互独立的,但HTTP 1.1协议被设计成符合REST原则和限制的理想协议。可以将HTTP和REST之间的关系看作是,REST是设计,而HTTP 1.1是该设计的实现。


9

HTTP是一种通过网络传输消息的通信协议。SOAP是一种协议,用于交换基于XML的消息,并可以使用HTTP来传输这些消息。Rest是一种协议,用于交换任何(XML或JSON)消息,并可使用HTTP来传输这些消息。


你的回答并没有解答这个问题。 - Anis LOUNIS aka AnixPasBesoin
2
你的HTTP和SOAP定义很好,为我解决了问题。但我不认为Rest是一个协议。它是一种架构指南,强制正确使用HTTP传输协议。 - user5228393

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