REST
目录
¶概述
REST ( REpresentational State Transfer )(资源)表现层状态转化,是目前流行的一种互联网软件架构风格,具有以下特点:
¶资源(Resource)
🤔什么是资源?
🎶通过访问资源的 URI 就可以获取对应的资源,因此 URI 即为每一个资源的独一无二的识别符。
¶表现层(Representation)
¶状态转化(State Transfer)
每发出一个请求,就代表了客户端和服务器的一次交互过程,由于 HTTP 协议是一个无状态协议,所以交互过程中的状态最终都保存在服务器端。因此,如果客户端想要操作服务器,必须通过某种手段,让服务器端发生状态转化(State Transfer)。而这种转化是建立在资源表现之上,所以称为表现层状态转化
使用 HTTP 协议进行举例是因为:HTTP 是目前互联网在应用层交互使用最多的一种协议
¶REST 到底是什么?
前面讲述了 REST 包含的几个概念,那么到底什么是 REST ,其实仍然还不太清楚。在了解 REST 是什么之前,先考虑这样一个问题:传统方式下,如何进行前后端的资源转化?
¶传统方式操作资源
传统操作资源的方式,就是通过 URL 中访问的资源名来了解操作的行为,比如下表:
URL | 含义 |
---|---|
http://127.0.0.1/item/queryUser.action?id=1 | 进行查询 |
http://127.0.0.1/item/saveUser.action | 进行新增 |
http://127.0.0.1/item/updateUser.action | 进行更新 |
http://127.0.0.1/item/deleteUser.action?id=1 | 进行删除 |
¶请求方式
上面主要存在的问题就是:资源过多时,对这些资源的状态转化很难管理。为了解决这种问题,就提出了 REST 这样一种软件架构,其实也就是一种思想,类似于接口的概念,具体如何实施是后面 RESTful 的事情。
❓REST 是如何解决资源转换问题的?
HTTP 协议操作动词 | 含义 |
---|---|
GET | 获取资源 |
POST | 新建资源 |
PUT | 更新资源 |
DELETE | 删除资源 |
¶使用 RESTful 操作资源
这里做出对传统方式操作资源的重构,通过 GET、 POST、 PUT、 PATCH、 DELETE 等方式对服务端的资源进行操作。
请求 | URL | 含义 |
---|---|---|
GET | /users | 查询用户信息列表 |
GET | /users/1001 | 查看某个用户信息 |
POST | /users | 新建用户信息 |
PUT | /users/1001 | 更新用户信息(全部字段) |
PATCH | /users/1001 | 更新用户信息(部分字段) |
DELETE | /users/1001 | 删除用户信息 |
¶REST 与 RESTful
🤔之前提到了 RESTful,那么什么是 RESTful?它与 REST 是什么关系?
🤔为什么使用 RESTful
¶如何设计 RESTful 风格的 API
既然 RESTful API 是基于 REST,那么到底应该如何设计 RESTful API 的接口?
¶使用名词而不是动词
举例来说,有一个 API 提供动物园(zoo)的信息,还包括各种动物和雇员的信息,则它的路径应该设计成下面这样:
¶GET 方法和查询参数不应该涉及状态改变
¶使用复数名词
不要混淆名词单数和复数,为了保持简单,对所有资源使用复数:
¶使用子资源表达关系
如果一个资源与另外一个资源有关系,使用子资源:
¶为集合提供过滤、排序、选择和分页等功能
Filtering 过滤:
使用唯一的查询参数进行过滤:
Sorting 排序:
允许针对多个字段排序
Field selection
移动端能够显示其中一些字段,其实不需要一个资源的所有字段,给 API 消费者一个选择字段的能力,这会降低网络流量,提高 API 可用性
Paging 分页
¶版本化 API
版本化 API 能够方便的进行 API 的版本控制,不要发布无版本的 API 项目庞大之后不容易管理,使用简单数字,避免小数点如2.5
,一般在 Url 后面使用 ?v
,或者如下方法/blog/api/v1
¶允许覆盖 HTTP 方法
一些代理只支持 POST 和 GET 两种请求方式,为了使这些有限方法支持 RESTful API,使用订制的 HTTP 头 X-HTTP-Method-Override 来覆盖 POST 方法,最终根据X-HTTP-Method-Override
头部信息,进行请求方式的判断