REST API
第一次接触REST API时有些迷惑,后来查阅了一些相关的文章并结合上自己的一些总结,总算对其有粗略的了解。
1. 起源
REST这个词,是Roy Thomas Fielding在他2000年的博士论文中提出的。关于他,这里简单介绍一下:他是HTTP协议(1.0版和1.1版)的主要设计者、Apache服务器软件的作者之一、Apache基金会的第一任主席。这样也不难理解,为什么他的这篇论文一经发表,就引起了关注,并且立即对互联网开发产生了深远的影响。(毕竟是大佬)。
REST,即Representational State Transfer的缩写,中文翻译叫:“表现层状态转化”。从其名字来看的确难以读懂这是个什么东西。而我是这么理解的:对服务器端的API操作等能从URI(统一资源定位符)中体现出来就叫做REST。简单地说:就是能从URI的字段中体现对后端发起何种请求就叫做"表现层状态转化"。也就是实现某URL所代表资源的状态转移。(听起来可能别扭)
2. REST是什么?
对于REST我更愿意把他理解为是一种对HTTP API的一种规范和约束,或者说是一种API设计思想,事实上它本质上也体现了这点。
RESTful 的核心思想就是,客户端发出的数据操作指令都是"动词 + 宾语"的结构。
根据 HTTP 标准,HTTP 请求可以使用多种请求方法:
- HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD方法。
- HTTP1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。
而REST核心就是能使用HTTP中其中定义的5种HTTP请求方法对应上CRUD 操作。
2.1 对应上CRUD操作
以下是5种HTTP请求方法对应上CRUD 操作:
GET:读取(Read)
POST:新建(Create)
PUT:更新(Update)
PATCH:部分更新(Update)
DELETE:删除(Delete)
也就是说服务程序中的特定操作被映射成为标准的 HTTP 方法——为了消除歧义,而非直接通过GET,POST的方式直接调用后端某些CRUD的数据操作接口。
就像下面这种图一样:
这样约束地话的确可以通过URL和请求方式就能大概知道我们想干什么了。
2.2举例
我想查找ID为1的订单,我就可以通过:
GET http://example.com/order/1
创建一个新订单可以:
POST http://example.com/order
#在HTTP请求体中发送要添加的订单的信息
{
id:1,
order:"MIX 8",
num:2,
...
}
修改数量
PUT http://example.com/order
#PUT为全跟新,所以HTTP请求体中发送要订单全部信息,
#达到覆盖修改
{
id:1,
order:"MIX 8",
num:1,
...
}
删除第一条订单:
DELETE http://example.com/order/1
这里只是简单地举个例子,具体看实际情况而定。所以说,REST我更愿意把他理解为是一种对HTTP API的一种规范和约束,或者说是一种API设计思想。
2.3 应该遵循关键原则
当然这些原则其实是来自一篇文章,在文章中作者对REST作了总结并对其5条关键原则了做解析。
五条关键原则列举如下:
- 为所有“事物”定义 ID
- 将所有事物链接在一起
- 使用标准方法
- 资源多重表述
- 无状态通信
3. 覆盖GET和POST
有些客户端只能使用GET
和POST
这两种方法。服务器必须接受POST
模拟其他三个方法(PUT
、PATCH
、DELETE
)。这时,客户端发出的 HTTP 请求,要加上X-HTTP-Method-Override
属性,从而告知服务器应该使用哪一个HTTP请求方式解析该请求,覆盖POST
方法。
POST http://example.com/order/
#在请求体头部添加
X-HTTP-Method-Override: PUT