RESTful(Representational State Transfer)表现层状态转化,最早出现在 Roy Thomas Fielding的
博士论文:Architectural Styles and
the Design of Network-based Software Architectures中 。
Fielding不仅参与HTTP和HTTP1.1的主要设计,还是 Apache服务器软件的的作者之一。
RESTful是一种以网络为基础的应用软件的架构设计标准。
Representational
Representational是最不容易翻译的,represent:意为代表,动词。 representation意为表示,名词。 representational,为形容词,意为代表性的。总体上,我们可以知道,
represent是用某种方式代表某种东西的意思。
现在,我们再来理解几个基本概念。
Resource:网络中的资源是指:一张图片、一个视频、一首歌、一个服务、一个.txt文件等。这些都是网络上的实体。可以通过 URI唯一指定获取。
URI:(Uniform Resource Identifier),统一资源标识符。在网络中标识出一个资源,比如一个网站(https://pic2.zhimg.com),但是这个URI返回的数据是什么不确定的,如果那边想默认返回一个图片,也是可以的。
URL:(Uniform Resource Locator),统一资源指定符。在网络中指定一个资源,比如一个图片(https://pic2.zhimg.com/v2-f677623a2f59618b411737861f278d34_r.jpg),唯一指定名为v2-f677623a2f59618b411737861f278d34_r.jpg的图片。
所以你可以说,URL是 URI的子集。注意,后缀 .jpg表示文件的格式。而他具体的表现形式(是以二进制表现出来,还是以一张图片表现出来,或某种编码形式表现出来),应该在请求头的 Accept和Content-Type中指定。
Representational就是指资源实体表现出来的方式的总称。称为表现层。
状态转化(State Transfer)
Representational State Transfer表现层状态转化,就容易理解了。将服务端的资源的状态转化。而这种转化是建立在表现层之上的。(用户也只能通过表现层和服务端的资源进行互动)
而客户端用到的和服务端资源交互的手段也只有HTTP协议。具体指四个方法:GET(获取资源)、POST(新建资源,也可用于更新资源)、PUT(更新资源)、DELETE(删除资源)。
总结:
URI代表网络中的一种资源,通过URI在客户端和服务端之间与资源进行交互,客户端通过HTTP的4个动词操作资源。而操作这些资源实在表现层中进行的,表现层是指资源表现出来的方式的抽象总称。
使用:
资源:
https://www.baidu.com:这里的资源是整个网站https://www.example.com/email/:这里的资源是email- ``https://www.example.com/img/cat.png
:这里的资源是cat.png`
方法:
前面我们知道动词只能使用GET、POST、PUT、DELETE,以下是使用案例:
GET https://www.example.com/order/1:获取订单信息POST https://www.example.com/order/2:新建一个订单PUT https://www.example.com/order/2: 修改订单信息DELETE https://www.example.com/order/1: 删除订单信息
误区:
-
获取所有商品:
POST https://www.example.com/goods/show/1修改为:GET https://www.example.com/goods/1,show是一个动词,不能出现在URI中。 -
发送邮件:
https://www.example.com/send/email/或https://www.example.com/send_email/修改为POST https://www.example.com/email/sending。这里的资源是邮件,发送这个动作可以理解为sending服务,也是一种资源。 -
URI中添加版本信息:https://www.example.com/app/1.0/foo、https://www.example.com/app/2.0/foo、https://www.example.com/app/3.0/foo,API的不同版本可以理解为资源的不同表现形式,所以采用同一个URI,区分版本在请求头中区分(Accept: vnd.example-com.foo+json; version=1.0)就好。