简介
通常,REST和HTTP是可以互换使用的。在本文中,我们将研究REST、HTTP的真正含义以及它们为什么是两个不同的东西。
什么是REST?
REST全称Representational State Transfer表述性状态转移,它最早是在罗伊·菲尔丁(Roy Fielding)的论文中提出。在论文中,菲尔丁提出了他对于理想的万维网软件体系结构的构想。
REST不是一种标准或者规范,相反,菲尔丁将REST描述为分布式超媒体系统的体系结构。他认为RESTful结构具有多个属性,因此REST非常适合大型的互联系统,例如Internet。
接下来,我们将解读定义RESTful系统的属性。
资源和表示
RESTful系统的核心构建块是资源,资源可以是网页、视频流、图像等。资源甚至可以是抽象的概念,如数据中用户的列表或特定位置的天气预报。唯一真正的限制是系统中的每个资源都是唯一且可标识的。
另外,资源可能有很多种表示形式,在C/S(客户端/服务器)架构中,服务负责管理资源的状态,但是客户端可以选择他们自己希望与之交互的表示方式。
统一接口
统一接口是RESTful系统独特的属性之一,它要求客户端使用同一套标准操作来访问所有的资源。
统一接口的好处在于易于创建与其提供的服务脱钩的实现,这使得服务可以在不影响客户端的情况下发展。需要权衡的是,统一的接口可能会对某些系统增加了不必要的限制,或要求服务器执行的效率低于专门操作的效率,如果Spring Cloud的服务调用是没有Dubbo的效率高。
无状态
RESTful系统中,所有的操作都应该是无状态的。这意味着从客户端到服务器的每个调用都不得依赖任何的共享状态,这也意味着对服务器的每个请求都必须包含服务器完成请求所需要的所有数据。
REST中的无状态要求让位于几个关键属性:
- 可见性:可以单独分析每个请求,以监视系统运行状况和响应速度
- 可靠性:系统故障时,更容易从中恢复
- 可拓展性:简单地添加更多的服务器资源以处理更多的请求
但是,这也会带来一个折衷,即当客户端与服务器进行多次交互式时,对武器的请求会更大,并包含重复数据。
什么是HTTP?
与REST不同,超文本传输协议(HTTP)是具有明确定义的、约束的标准。HTTP是为互联网上大多数日常教育提供的通信协议:
- Web浏览器加载网页
- 串流影片
- 使用移动设备关闭家中的灯
显然REST和HTTP不一样。HTTP是Internet工程任务组维护的协议,尽管它与REST不同,但是它就有RESTful系统的许多功能。这并非偶然,因为Roy Fielding是RFC for HTTP的原始作者之一。
重要的是RESTful系统不需要使用HTTP,碰巧的是,HTTP是一个很好的开始,因为它表现出许多RESTful的品质。
让我们仔细看看使HTTP成为RESTful协议的一些特质。
网站和媒体类型
在HTTP的世界中,资源通常是远程服务器上的文件。这些可以是HTML、CSS、JavaScript、图形以及构成现在网页的所有其他文件。每个文件都可以视为可以使用唯一URL寻址的独特资源。
但是,HTTP不仅用于文件。资源一词还可以指远程服务器上的任意数据:客户、产品、配置、设置等等。这就是为什么HTTP在构建现代API方面变得流行的原因,它提供了一种一直且可预测的方式来访问和操作远端数据。
此外,HTTP允许客户端为某些资源选择不同的表示形式。在HTTP中,使用表头和各种所知的媒体类型来处理的。
例如,一个天气网站可以为同一个天气预报提供HTML和JSON来表示。一个适合在Web浏览器中显示,而另外一个适合给另外一个系统用来存档历史天气数据。
HTTP方法
HTTP遵循REST原理的另外一种方式是,它为每种资源系统相同的方法集。尽管有近十二种可用的HTTP方法,但是大多服务器主要处理映射CRUD操作的四种方式是:POST、GET、PUT、DELETE。
提前了解了这些操作可轻松创建、使用Web服务的客户端。与SOAP协议相比,HTTP可以使一直到的操作集保持最小且一致,而SOAP协议的操作可以进行自定义且不受限制。
当然,单个Web服务可能选择拒绝某些资源的某些方法,或者他们需要对某些敏感资源进行身份验证。无论如何,一组可能的HTTP方法是众所周知的,并且不能在一个网站之间变化。
HTTP并非始终是RESTful
但是,对于HTTP实现RESTful原理的所有方式,都有可能也违反它们的方式。
首先,REST不是通讯协议,而HTTP是通讯协议。
接下来,也许最具有争议的是,大多数现在Web服务器都是用cookie和会话存储状态。当使用这些引用服务端的状态时,这就违反了无状态原则。
最后,使用URL(由IETF定义)可能会使Web服务器范围统一接口。例如:下面的URL:
https://toolkit.net.cn/api/v1/customers?id=17&action=clone
尽管必须使用诸如GET之类的预定义的HTTP方法之一来请求此URL,但是它正在使用查询参数来提供其他操作。这种情况,我们要指定一个名为clone的操作,该操作显然不适合用于系统中的所有资源。如果没有更详细的说明,也不清楚响应的是什么。
结论
虽然许多人交替使用使用术语REST和HTTP,但事实上他们是不同的东西。REST是指一组特定体系结构样式的属性。而HTTP是定义良好的协议,它切好表现除了RESTful系统的许多功能。