REST的含义和RESTful架构入门
提纲
1、REST架构的作用
2、REST和RESTful
3、REST的具体含义
3.1 资源实体
3.2 资源实体的表现层
3.3. 资源实体某一变现层的状态转化
3.4 REST原则含义的总结
4、RESTful架构
5、什么是RESTful API
1、REST架构的作用
==================
在互联网出现之前,软件和网络是两个不同的领域,很少有交集。软件开发主要是开发针对单机环境的软件,比如以前的杀毒软件卡巴斯基、扫雷之类的;而网络则主要研究系统之间的通信。
但是,互联网的出现以后,逐渐出现了基于互联网的网络软件系统,于是,这两个领域开始融合。
现在我们必须考虑,如何开发在互联网环境中使用的软件,即我们日常所说的网站。越来越多的人开始意识到,网站即软件,而且是一种不同于以前单机软件的新型软件。网站开发,完全可以采用软件开发的模式。
RESTful架构,就是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便,正在被越来越多网站的采用。
以前网站都是前端和后端混在一起的,比如Jsp页面中同时有jsp代码和html代码。这种情况在桌面时代问题不大,但是,近年来移动互联网快速发展,各种类型的客户端逐渐出现,比如android手机、android平板、iphone、ipad等,开发者想为所有的客户端提供一套统一的服务器端程序,RESTful架构的服务器端程序可以做到。RESTful架构的服务器端可以通过一套统一的接口同时为Web,iOS和Android提供服务。
如上面的图所示,服务器端统一提供一套RESTful API,webapp+ios+android作为同等公民调用这套API。
2、REST和RESTful
=================
REST 是REpresentation State Transfer的缩写,这个词首先于2000 年出现在Roy Thomas Fielding 的博士论文中。Roy Thomas Fielding是一个很重要的人物,他是HTTP协议(1.0版和1.1版)的主要设计者、Apache服务器软件的作者之一、Apache基金会的第一任主席。所以,他的这篇论文一经发表,就引起了关注。
Fielding将他对互联网软件的架构原则,定名为REST,即Representational State Transfer的缩写。这个词组可以翻译为"表现层状态转化"。如果一个架构符合REST原则,就称它为RESTful架构
3、REST的具体含义
=================
这里对REST的具体含义和REST架构的具体内容进行说明。
3.1 资源实体
-------------------
在REST的名称"表现层状态转化"中,省略了表现层的定语。"表现层"其实指的是"资源"(Resources)的"表现层"。
所谓"资源",就是网络上的一个实体。它可以是一段包含在html文件中的文本、一张格式为jpg的图片、一首mp3音乐文件、一种服务等类似的一个具体的实体。通常用一个URI(统一资源定位符)指向它来在网络上定位它,每种资源对应一个特定的URI。要获取这个资源,访问它的URI就可以了。此URI就成了每一个资源的地址或是标识符。
这样以来,上网就可以看成是访问一系列的URI,得到一系列的实体的过程。也就是客户端和服务器端的传递实体进行互动的过程。
3.2 资源实体的表现层
-------------------------------
"资源"是一种实体,它可以有多种外在表现形式。我们把"资源"具体呈现出来的形式,叫做它的"表现层"(Representation)。比如,文本是一个资源实体,它的具体表现形式可以用txt格式,也可以是HTML格式、XML格式、JSON格式等;一个图片是一个实体,它的表现形式可以可以是jpg格式,也可以是png格式。
这就是资源和资源的表现层的关系,就是实体和实体的外在形式的关系,但是需要知道的是,一个实体总是以一种外在表现形式存在的。
URI只代表资源实体,不能代表它的表现层。所以,严格地来讲,很多网址最后的".html"后缀名是不必要的,因为这个后缀名表示的是实体的格式,属于"表现层"范畴,而URI应该只代表"资源"实体,至于资源实体的具体表现形式,应该在HTTP请求的头信息中用Accept和Content-Type字段指定,这两个字段才是指定"表现层"的地方。
3.3 资源实体某一表现层的状态转化
-------------------------------------------------
访问一个网站的过程,就是客户端和服务器端的一个互动过程。具体来说,就是客户端不断通过URI来请求服务器端的资源实体,同时服务器端把资源实体通过HTTP响应消息发送给客户端。
Web的通信协议是HTTP协议,它是一个无状态协议。因此,客户端和服务端交互过程中的所有的状态都保存在服务器端。
因此,客户端操作服务器端,就是通过某种手段,使服务器端的实体发生"状态转化"(State Transfer)。而这种转化是建立在表现层之上的,因为客户端总是和服务器端实体的某一个表现层进行交互,所以就是"表现层状态转化"。
客户端用到的手段,只能是HTTP协议。也就是说,在上网的过程中,客户端通过HTTP协议使得服务器端实体的表现层发生了状态的变化,这就叫做“表现层状态转化”。
客户端具体用HTTP的什么东西才能使服务器端实体的表现层发生状态变化呢?
客户端操作服务端实体状态的手段,具体来讲,就是HTTP协议中四个表示操作方式的动词——GET、POST、PUT、DELETE。客户端通过这四个动词来操作服务器端。
它们分别对应四种基本操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源。也就是说,客户端通过HTTP协议的GET、POST、PUT、DELETE来对服务器端的实体进行增删改查,从而改变服务器端实体的状态。
3.4 REST原则含义的总结
-------------------------------------
以上介绍的就是REST原则的具体含义和基本要求。
总结一下,有如下三个关键点:
(1)使用URI来标识服务器端的资源实体,每一个URI代表一个资源。
(2)客户端和服务器之间,传递这种资源的某种表现层。客户端在请求服务器端的资源实体的时候,请求的是资源的某一种表现层,而服务器端在响应客户端的时候,也是给出请求的实体的对应表现层。
(3)客户端通过四个HTTP动词,对服务器端资源进行操作,从而使服务器端的资源实体发生状态变化,也就是"表现层状态转化"。
4、RESTful架构
==============
上面讲清楚了REST的具体含义,如果一个互联网软件系统的架构符合REST的3点基本要求,那么这个互联网软件系统的架构就是RESTful架构。
5、什么是RESTful API
======================
这里通俗地理解一下什么是RESTful API
以下是两种解释:
解释一:
RESTful API,无论它的名字多么高大上,它本质还是一个HTTP请求,POST也好,GET也罢,都是不同的数据提交方式。所以,能够决定一个Rest API的也就:URI、参数、请求方式、请求头等。
解释二:
REST就是用http协议实现的函数声明。
协议名加域名表示可见性。
url域名后面的部分可以看成函数名(可以是多级的),也可以表示参数。
url参数也可以作为函数参数(通常是与查询相关的参数)。
http request header里面的是函数参数(通常是一些身份验证、函数版本方面的参数)。
http request body里面的报文数据也可以作为函数参数(通常是与插入更新相关的参数)。
http request method表示当函数名相同时,重载的是增删改查哪个操作(通常,POST表示增,DELETE表示删,PUT表示改,GET表示查)。
http response就是函数返回值了。
举例来说,以知乎27785028号题目的url来讲,https://www.zhihu.com/question/27785028,http://zhihu.com表示全网可见,在http://zhihu.com这个包里question就是函数名,27785028是路径参数,表示题号。
当我回答你的时候,请求的是POST下的重载,我输入的内容就作为报文参数。
当知友访问这个链接的时候,浏览器接收到的http响应就是GET重载下的返回值。