django-drf入门规范(二)
一. RESTful API规范
-
数据的安全保障
url链接一般都采用https协议进行传输
注:采用https协议,可以提高数据交互过程中的安全性
-
接口特征表现
用api关键字标识接口url:
-
https://api.baidu.com
-
https://www.baidu.com/api
注:看到api字眼,就代表该请求url链接是完成前后台数据交互的
-
-
多数据版本共存
在url链接中标识数据版本
https://api.baidu.com/v1
https://api.baidu.com/v2
注:url链接中的v1、v2就是不同数据版本的体现(只有在一种数据资源有多版本情况下)
-
数据既是资源, 均使用名词(复数可用)
-
接口一般都是完成前后台数据的交互,交互的数据我们称之为资源
https://api.baidu.com/users
https://api.baidu.com/books
https://api.baidu.com/book
注:一般提倡用资源的复数形式,在url链接中奖励不要出现操作资源的动词,错误示范:
https://api.baidu.com/delete-user
-
特殊的接口可以出现动词,因为这些接口一般没有一个明确的资源,或是动词就是接口的核心含义
https://api.baidu.com/place/search
https://api.baidu.com/login
-
-
资源操作由请求方式决定(method)
操作资源一般都会涉及到增删改查,我们提供请求方式来标识增删改查动作
https://api.baidu.com/books
- get请求:获取所有书https://api.baidu.com/books/1
- get请求:获取主键为1的书https://api.baidu.com/books
- post请求:新增一本书书https://api.baidu.com/books/1
- put请求:整体修改主键为1的书https://api.baidu.com/books/1
- patch请求:局部修改主键为1的书https://api.baidu.com/books/1
- delete请求:删除主键为1的书
-
过滤, 通过url上传参数的形式传递搜索条件
https://api.example.com/v1/zoos?limit=10
:指定返回记录的数量https://api.example.com/v1/zoos?offset=10
:指定返回记录的开始位置https://api.example.com/v1/zoos?page=2&per_page=100
:指定第几页,以及每页的记录数https://api.example.com/v1/zoos?sortby=name&order=asc
:指定返回结果按照哪个属性排序,以及排序顺序https://api.example.com/v1/zoos?animal_type_id=1
:指定筛选条件
-
相应状态码
正常相应
响应状态码2xx
- 200:常规请求
- 201:创建成功
重定向相应
响应状态码3xx
- 301:永久重定向
- 302:暂时重定向
客户端异常
响应状态码4xx
- 403:请求无权限
- 404:请求路径不存在
- 405:请求方法不存在
服务器异常
响应状态码5xx
- 500:服务器异常
-
错误处理, 返回错误信息, error当做key
{ error: "无权限操作" }
-
返回结果, 针对不同操作, 服务器向用户返回的结果符合以下规则
GET /collection:返回资源对象的列表(数组) GET /collection/resource:返回单个资源对象 POST /collection:返回新生成的资源对象 PUT /collection/resource:返回完整的资源对象 PATCH /collection/resource:返回完整的资源对象 DELETE /collection/resource:返回一个空文档
-
每个资源都有一个特定的请求链接
# Hypermedia API,RESTful API最好做到Hypermedia,即返回结果中提供链接,连向其他API方法,使得用户不查文档,也知道下一步应该做什么 { "status": 0, "msg": "ok", "results":[ { "name":"肯德基(罗餐厅)", "img": "https://image.baidu.com/kfc/001.png" } ... ] }
比较好的返回接口
# 响应数据要有状态码、状态信息以及数据本身 { "status": 0, "msg": "ok", "results":[ { "name":"肯德基(罗餐厅)", "location":{ "lat":31.415354, "lng":121.357339 }, "address":"月罗路2380号", "province":"上海市", "city":"上海市", "area":"宝山区", "street_id":"339ed41ae1d6dc320a5cb37c", "telephone":"(021)56761006", "detail":1, "uid":"339ed41ae1d6dc320a5cb37c" } ... ] }
总结
http://127.0.0.1:8000/api/v2/zoos/?limit=10
http协议/接口特征api/版本号/资源(名词复数)/?过滤参数
二. 序列化
-
api接口开发,最核心最常见的一个过程就是序列化,所谓序列化就是把数据转换格式,序列化可以分两个阶段:
-
序列化: 把我们识别的数据转换成指定的格式提供给别人。
-
例如:我们在django中获取到的数据默认是模型对象,但是模型对象数据无法直接提供给前端或别的平台使用,所以我们需要把数据进行序列化,变成字符串或者json数据,提供给别人。
-
反序列化:把别人提供的数据转换/还原成我们需要的格式。
-
例如:前端js提供过来的json数据,对于python而言就是字符串,我们需要进行反序列化换成模型类对象,这样我们才能把数据保存到数据库中。
三. Django Rest_Framework入门
-
核心思想: 缩减编写api接口的代码
-
Django REST framework是一个建立在Django基础之上的Web 应用开发框架,可以快速的开发REST API接口应用。在REST framework中,提供了序列化器Serialzier的定义,可以帮助我们简化序列化与反序列化的过程,不仅如此,还提供丰富的类视图、扩展类、视图集来简化视图的编写工作。REST framework还提供了认证、权限、限流、过滤、分页、接口文档等功能支持。REST framework提供了一个API 的Web可视化界面来方便查看测试接口。
特点
-
提供了定义序列化器Serializer的方法,可以快速根据 Django ORM 或者其它库自动序列化/反序列化;
-
提供了丰富的类视图、Mixin扩展类,简化视图的编写;
-
丰富的定制层级:函数视图、类视图、视图集合到自动生成 API,满足各种需要;
-
多种身份认证和权限认证方式的支持;[jwt]
-
内置了限流系统;
-
直观的 API web 界面;
-
可扩展性,插件丰富
-
提供了定义序列化器Serializer的方法,可以快速根据 Django ORM 或者其它库自动序列化/反序列化;
-
提供了丰富的类视图、Mixin扩展类,简化视图的编写;
-
丰富的定制层级:函数视图、类视图、视图集合到自动生成 API,满足各种需要;
-
多种身份认证和权限认证方式的支持;[jwt]
-
内置了限流系统;
-
直观的 API web 界面;
-
可扩展性,插件丰富
正在更新下一节!