- Title(EN): Django REST Framework Learning Notes (1): Hello RESTful API
- Author: dog2
前后端分离是大势所趋
按
最近在学习Django Rest Framework,官方教程较短,看完感觉并没有学习到最佳实践,对DRF的了解还是不成体系。官方API文档虽然详细一些,但内容多且零散更适合查阅,对于系统性学习来说还是差了一点。
于是找到了一套不错的DRF源码分析视频来学习,并且在这里记下学习笔记。
参考了这两位同学的笔记,大部分是视频讲师在视频里做过的课堂笔记。
- 随笔分类 - Django REST framework笔记
- 随笔分类 - Django--drf相关
根据我个人理解对笔记做了部分修改、整理和补充。这里有我的测试代码可供参考,包括django项目、db数据和postman的测试数据包。
基本概念
- RESTful: Representational State Transfer 表现层状态转换
- ful: 形容词后缀,表示“(这一)类的、(这种)风格的”
- API: Application Programming Interface 应用程序接口
- 接口:联系两个物质的媒介,完成信息交互
- Web程序接口
- 功能:联系前台页面与后台数据库的媒介
- 组成
- url: 长得像返回数据的url链接
- 请求参数: 前台按照指定的key提供数据给后台
- 响应数据: 后台与数据库交互后将数据反馈给前台
RESTful API
接口规范
- 功能:为了采用不同的后台语言,也能使用同样的接口,获取到同样的数据
- 接口:
- url
- 相应数据
- 接口文档:
- url + 请求参数
- 响应数据
URL规范
RESFful API的URL应包含如下部分:
用api关键字标识接口url
如 - api.baidu.com - www.baidu.com/api
优先选择https协议
接口数据安全性考量
版本标识
如
- api.baidu.com/v1/...
- api.baidu.com/v2/...
资源
接口操作的数据对象,在url中一般采用资源(名词)复数形式。一个接口可以包含对该资源的多种操作方式。如
- api.baidu.com/books
- api.baidu.com/books/(pk)
请求方法
HTTP请求方法,标识操作资源的方式,如
GET /books/
&GET /books/(pk)
: 获取所有/获取一个POST /books/
: 增加一个(多个)DELETE /books/(pk)
: 删除一个PUT /books/(pk)
: 整体更新一个PATCH /books/(pk)
: 局部更新一个
请求参数
往往涉及数据的各种过滤操作及表现形式 - 筛选、排序、限制,如
- api.baidu.com/books/?search=西&ordering=-price&limit=3
响应数据
API返回的数据,一般为Json格式,如
1 | { |
- 响应状态码:由开发者(前端、后端、客户)定义,是对资源请求结果的应用层状态码,非HTTP响应状态码。
- 常见字段名示例:
"status"
"errcode"
- 常见值示例:
0
: 表示操作资源成功1
: 表示操作资源失败2
: 表示操作资源成功,但没匹配结果
- 常见字段名示例:
- 响应状态码文字说明
- 常见字段名示例
"msg"
"message"
- 常见字段名示例
- 资源本身
- 常见字段名示例
"data"
"results"
- 常见字段名示例
注意:不能直接返回的资源(子资源、图片、视频等资源),而是返回该资源的url链接
基于restful规范的原生Django接口
测试代码及数据请参见 demo项目 no1_my_restapi
原生接口对各种格式的POST数据的支持情况如下:
- [x] form-data
- [x] x-www-form-urlencoded
- [ ]
raw:包括 常见的json、xml等
也就是说 原生接口并不支持对POST请求中json数据的自动解析,后端只能拿到整个json字符串
DRF - Django REST Framework
DRF有如下主要模块:
1 | from rest_framework.views import APIView, ... # 视图模块 - 对django原生视图类的封装 |
可以看到 DRF 在 django原有基础上进行类封装,并实现类 RESTful API的各大基础功能。
原生View不同,DRF实现了对json格式的POST请求数据的自动解析:
- [x] form-data
- [x] x-www-form-urlencoded
- [x] raw:包括 常见的json、xml等
扩展阅读
- A RESTful Tutorial
- API Design Cheat Sheet: 中文 / EN
- DRF API 指南
- DRF 官方文档(历史版本)中文翻译
- HTTP后台端:RESTful API接口设计