Django REST framework
1.Restful 设计风格
1.1 Restful 概念
REST这个词,是 Roy Thomas Fielding 在他2000年的博士论文中提出的。
Fielding将他对互联网软件的架构原则,定名为REST,即Representational State Transfer的缩写,可以根据单词含义翻译为“表现层状态转化”。
如果一个架构符合REST原则,就称它为 RESTful 架构。
例如对于后端数据库中保存了商品的信息,前端可能需要对商品数据进行增删改查,那相应的每个操作后端都需要提供一个API接口,如下表格所示:
请求方法 | 请求地址 | 后端操作 |
---|---|---|
GET | /goods | 获取所有商品 |
POST | /goods | 增加商品 |
GET | /goods/1 | 获取编号为1的商品 |
PUT | /goods/1 | 修改编号为1的商品 |
DELETE | /goods/1 | 删除编号为1的商品 |
Restful 设计架构有以下特点:
- 每一个URL代表一种资源。
- 客户端和服务器之间,传递这种资源的某种表现层。
- 客户端和服务器之间,通过 HTTP 动词,对服务器端的资源进行获取、修改、删除等操作,实现“表现层状态转化”。
1.2 Restful 设计方法
-
协议
API与用户的通信协议,总是使用
HTTPS
协议。 -
域名
应该尽量将 API 部署在专用域名之下。
https://api.example.com
如果确定API很简单,不会有进一步扩展,可以考虑放在主域名下。
https://example.org/api/
-
版本
应该将API的版本号放入 URL。
https://api.example.com/v1/
-
路径(Endpoint)
路径又称“终点”(endpoint),表示 API 的具体网址。
在 Restful 架构中,每个网址代表一种资源(resource),所以网址中不能有动词,只能有名词,而且所用的名词往往与数据库的表格名对应。一般来说,数据库中的表都是同种记录的"集合"(collection),所以API中的名词也应该使用复数。
举例来说,有一个API提供动物园(zoo)的信息,还包括各种动物和雇员的信息,则它的路径应该设计成下面这样。
https://api.example.com/v1/zoos https://api.example.com/v1/animals https://api.example.com/v1/employees
-
HTTP 动词
对于资源的具体操作类型,由HTTP动词表示。
常用的HTTP动词有下面五个(括号里是对应的SQL命令)。
GET(SELECT):从服务器取出资源(一项或多项)。 POST(CREATE):在服务器新建一个资源。 PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。 PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。 DELETE(DELETE):从服务器删除资源。
还有两个不常用的HTTP动词。
HEAD:获取资源的元数据。 OPTIONS:获取信息,关于资源的哪些属性是客户端可以改变的。
如下是一些简单的示例:
GET /zoos:列出所有动物园 POST /zoos:新建一个动物园 GET /zoos/ID:获取某个指定动物园的信息 PUT /zoos/ID:更新某个指定动物园的信息(提供该动物园的全部信息) PATCH /zoos/ID:更新某个指定动物园的信息(提供该动物园的部分信息) DELETE /zoos/ID:删除某个动物园 GET /zoos/ID/animals:列出某个指定动物园的所有动物 DELETE /zoos/ID/animals/ID:删除某个指定动物园的指定动物
-
过滤信息(Filtering)
如果记录数量很多,服务器不可能都将它们返回给用户。API应该提供参数,过滤返回结果。
如下是一些常见的参数。
?limit=10:指定返回记录的数量 ?offset=10:指定返回记录的开始位置。 ?page=2&per_page=100:指定第几页,以及每页的记录数。 ?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序。 ?animal_type_id=1:指定筛选条件
参数的设计允许存在冗余,即允许API路径和URL参数偶尔有重复。比如,GET /zoo/ID/animals 与 GET /animals?zoo_id=ID 的含义是相同的。
-
状态码(Status Code)
服务器向用户返回的状态码和提示信息,常见的有以下一些(方括号中是该状态码对应的HTTP动词)。
200 OK - [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)。 201 CREATED -