RESTful架构入门

129 阅读3分钟

RESTful(Representational State Transfer)表现层状态转化,最早出现在 Roy Thomas Fielding的 博士论文:Architectural Styles and the Design of Network-based Software Architectures中 。

Fielding不仅参与HTTPHTTP1.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的图片。

所以你可以说,URLURI的子集。注意,后缀 .jpg表示文件的格式。而他具体的表现形式(是以二进制表现出来,还是以一张图片表现出来,或某种编码形式表现出来),应该在请求头的 AcceptContent-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`

方法: 前面我们知道动词只能使用GETPOSTPUTDELETE,以下是使用案例:

  • 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/foohttps://www.example.com/app/2.0/foohttps://www.example.com/app/3.0/foo,API的不同版本可以理解为资源的不同表现形式,所以采用同一个URI,区分版本在请求头中区分(Accept: vnd.example-com.foo+json; version=1.0)就好。