RESTful 架构

RESTful 架构

在上一篇文章中,我为大家介绍了 HTTP 协议。我们知道一个网络通信基于此协议,发送的网络请求叫做 HTTP 请求,返回的响应叫做 HTTP 响应。

本篇文章要介绍的 RESTful 架构就和 HTTP 协议的知识息息相关。

本文主要包含以下知识点:

  • RESTful 架构概述
  • RESTful API 设计示例
  • RESTful 架构优点

RESTful 架构概述

首先,RESTful 是一种 API 的设计规则。

要理解这个东西,我们还是采用老办法“拆词”。

RESTful” 后面的 “ful” 是一种单词后缀,多加在名词之后表示“充满…的、易于…、可…的、富有…的、具有…的”的意思,是最常用的形容词后缀。

类似的单词有:beautiful 美丽的、useful 有用的、helpful 乐于帮助的、skillful 有技巧的、bagful 一袋之量,满袋、basketful一满篮,一满筐 、capful一帽子、carful 一车之量 、cupful 一杯之量,满杯、dishful 一碟,一碟的量 、glassful 一杯的容量。

因此,我们可以去除后面的“ful”后缀,来看前面的单词“REST”。

REST 这个词,是 Roy Thomas Fielding 在他 2000 年的博士论文中提出的。

image-20211220151437640

Fielding 是一个非常重要的人,他是 HTTP 协议( 1.0 版和 1.1 版)的主要设计者、Apache 服务器软件的作者之一、Apache 基金会的第一任主席。

Fielding 将他对互联网软件的架构原则,定名为 REST,全称为 Representational State Transfer,翻译成中文则是“表征状态转移”。

如果一个软件的 API 架构符合 REST 原则,我们就称它为 RESTful 架构。

image-20211220151459917

那么,究竟什么是 REST 原则呢?

我相信即使翻译成了中文“表征状态转移”,基本上翻译了等于没翻译。

其实,之所以很难理解,是因为前面的主语被去掉了。REST 的英语全称实际上应该是 Resource Representational State Transfer,对应的中文就是“资源在网络中以某种表现形式进行状态转移”。

感觉好像要稍微好一些了,但是还是模模糊糊的,那么我们就继续拆词。

这里,我们再次将这个翻译进行拆解,可以分为 3 个部分:

  • Resource:资源,即数据。

  • Representational State:资源的状态,也就是资源的某种表现形式,比如用 JSON、XML、JPEG 等。

  • Transfer:(状态)变化。通过 HTTP 动词实现。

下面,我们来针对这 3 个部分依次进行说明。

资源( Resource

所谓“资源”,就是网络上的一个实体,或者说是网络上的一个具体信息。它可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的实在。

可以用一个 URL(统一资源定位符)指向它,每种资源对应一个特定的 URL。要获取这个资源,访问它的 URL 即可,而通过前面的学习我们知道,URLURI 的一种具体表现,因此 URI 是每一个资源独一无二的标志符。

所谓“上网”,就是与互联网上一系列“资源”的互动,调用这些资源的 URI

表现层( Representation State

“资源”是一种信息实体,它可以有多种外在表现形式。我们把“资源”具体呈现出来的形式,叫做它的“表征状态”( Representation State )。

比如,文本可以用 txt 格式表现,也可以用 HTML 格式、XML 格式、JSON 格式表现,甚至可以采用二进制格式。

图片可以用 JPG 格式表现,也可以用 PNG、GIF 的格式来进行表现。

URI 只代表资源的实体,不代表它的表现形式。

一个资源的具体表现形式,应该在 HTTP 请求的头信息中用 AcceptContent-Type 字段来指定,这两个字段才是对资源“表征状态”的描述。

(状态)变化( Transfer

访问一个网站,就代表了客户端和服务器端进行互动的一个过程。在这个过程中,必然会带来资源中数据以及状态的变化。

那么客户端在操作服务器端的某一个资源时,如果告知服务器端该资源的状态变化呢?

这里客户端能用到的手段,就是 HTTP 协议。

还记得前面在介绍 HTTP 请求时,我们有介绍过 HTTP 请求方法支持很多种不同的请求方式么?这其中,有 4 种请求方式分别对应了 4 种基本操作:

  • GET 用来获取资源

  • POST 用来新建资源(也可以用于更新资源)

  • PUT 用来更新资源

  • DELETE 用来删除资源

因此,综合上面的解释,我们来总结一下什么是 RESTful 架构:

  • 每一个 URI 代表一种资源。

  • 客户端和服务器之间,传递这种资源的某种表现层。

  • 客户端通过不同的 HTTP 动词,对服务器端资源进行操作,实现"资源表征状态的变化"。

RESTful API 设计示例

好了,关于 RESTful 理论方面的知识我们就介绍这么多,接下来我们来看一点实际的,来看一下使用 RESTful 设计 API 的具体示例。

Web 开发早期,后端设计 API 往往会包含对资源进行何种操作的动作信息。

例如:

systemAlias/controller/action

在该 API 中,往往包含了后端使用什么控制器,调用什么方法来对此资源进行操作的信息。

假设要设计一个删除评论的 API,往往设计出来的格式如下:

http://abc.com/?method=comment.del&id=x
http://abc.com/comment/del/id/x

在上面的 API 中,该 URL 已经不仅仅是只包含单纯的资源,还包含了对该资源进行删除操作的“动作”信息在里面,我甚至还能看出后端服务器在处理时,调用的是 comment.del 方法。

接下来我们来对上面的 API 进行修改,改为 RESTful 风格。

因为“资源”仅仅是表示一种实体,所以应该是一个名词,进而 URI 中是不应该有任何动词的。修改出来的 API 如下:

http://abc.com/comments/1

可以看到,这个 API 非常的干净,里面没有任何的动词,仅仅只表示一个资源,一个 id1 的评论资源,除此之外,没有任何其他东西了。

此时,你可能会出现这样的疑问:现在 API 确实是很纯粹了,但是我客户端发一个这样的请求到服务器端,服务器端怎么知道我要对这个资源做什么呢?

很简单,动词的部分虽然从 API 中去除了,但是并不是说没有了,而是将动词应该放在 HTTP 协议中了。由于 HTTP 请求方法支持很多种不同的请求方式,所以要删除一个资源的话,我们可以使用 DELETE 方法。

[DELETE] http://abc.com/comments/1

这也正是 RESTful 风格 API 最大的特点,以 HTTP 协议为强烈依托,之前类似于 http://abc.com/?method=comment.del&id=x 或者 http://abc.com/comment/del/id/x 这种以功能为主导的 URL 风格应该被舍弃,还原 URL 的本质,它的宗旨就是一个 URL 对应的应该是一个实体资源,里面不能包含任何动作。

[POST]     http://abc.com/users   // 新增
[GET]      http://abc.com/users/1 // 查询
[PATCH]    http://abc.com/users/1 // 更新(部分更新)
[PUT]      http://abc.com/users/1 // 更新(全部更新)
[DELETE]   http://abc.com/users/1 // 删除

另外,这里还需要说一下有关 PUTPATCH 两者之间的区别。

PUT 表示更新全部资源,而 PATCH 方法是新引入的,是对 PUT 方法的补充,用来对已知资源进行局部更新。

假设我们有一个 user 对象,里面有 userId、userName、userGender10 个字段。可你的编辑功能因为需求,在某个特别的页面里只能修改 userName,这时候的更新怎么做?

人们通常(为徒省事)把一个包含了修改后 userName 的完整 user 对象传给后端,做完整更新。

但仔细想想,这种做法感觉有点二,而且真心浪费带宽(纯技术上讲,你不关心带宽那是你土豪)。

于是 PATCH 诞生,只传一个 userName 到指定资源去,表示该请求是一个局部更新,后端仅更新接收到的字段。

PUT 虽然也是更新资源,但要求前端提供的一定是一个完整的资源对象,理论上来说,如果你用了 PUT,但却没有提供完整的 user 对象,那么缺了的那些字段应该被清空。

RESTful 架构优点

最近写文章,喜欢最后再来写要介绍的东西所具有的优点。因为我觉得在大家对介绍的东西都还不熟悉的时候就一一罗列优点,并没有太大的意义。

回到正题,RESTful 架构具体有什么优点呢?

首先第一个我觉得就是轻量。

通过上面的例子,相信大家也看到了使用 RESTful 之前和之后两种风格的 API 对比,很明显使用 RESTful 风格后,API 变得更加干净、纯粹。

干净主要体现在 API 中不再包含任何的动词,动词部分往往表示的是要对资源进行何种的处理,我们通过 HTTP 不同的请求方式来进行替代了。

纯粹主要体现在还原了 URL 的本质,就应该只表示一个资源。

另外,RESTful 风格 API 是在前后端分离开发的风潮下流行起来的,这里面其实也有时代背景的因素在里面。

在前后端不分离的时代,前后端是高度耦合的,后端开发到一定进度时,开始设计 APIAPI 中就包含了使用哪一个控制器,调用了什么方法等信息,然后将设计好的 API 交给前端,前端负责来调用这些接口。

但是到了前后端分离的时代,前后端是同时进行开发的,前端可以使用 Mock 来进行数据的模拟,所以需要一开始将数据接口统一下来,此时自然也就不能像之前一样 API 中还包含用到的控制器,用到的方法等信息,因为后端压根儿都还没开始开发。

因此,RESTful 风格的 API 设计解决了这个问题,前端也不需要关心曾经 API 中所包含的自己所听不懂的控制器之类的东西,双方都以资源为目标来协商 API 的设计,从而达到真正意义上的前后端分离开发。


总结

  1. 看URL就知道要什么

  2. 看HTTP method就知道干什么

  3. 看HTTP stuts code就知道结果如何

-EOF-

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值