测试开发进阶(二十四)
欢迎关注我的公众号「测试游记」
REST API
一种开发理念「是设计风格 而不是标准」
REST is acronym for REpresentational State Transfer.
每一个URL代表一种「资源」
具体要对资源做什么操作,要体现在请求方式上,而不是URL上
- json格式数据
- text文本
- 图片,视频等
客户端和服务器之间,传递这种资源的某种表现形式
- 通过请求头中的
Content-Type
来指明传给服务端的参数类型
text/plain
application/xml
text/html
application/json
image/gif
image/jpeg
Application/x-www-form-urlencoded
- 通过请求头中
Accept
来指明希望接受服务端的数据类型
Accept:application/json,application/xml;q=0.9,*/*;q=0.8
- POST:创建「create」
- GET:获取「read」
- PUT:更新,替换「update/replace」
- PATCH:部分更新「Partial update/modify」
- DELETE:删除「delete」
设计规则
命名
- 尽量使用名词复数形式
- 往往与数据库的表名对应
过滤条件
一般记录数量较多,服务器不可能将所有数据都返回给前端
例如:
1 | ?page=2&size=10 指定页数,条数 |
域名
尽量使用专用域名
前后端分离之后,前后端都有一个域名
例如http://api.xxx.xxx
版本
- 在url中呈现版本号
1 | http://api.xxx.xxx/app/0.1 |
- 在请求头中呈现
1 | Accept: application/vnd.example.v0.2+json |
常见请求含义
- GET(SELECT):从服务器获取资源(一项或多项)
- POST(CREATE):从服务器新建一个资源
- PUT(UPDATE):从服务器更新资源(客户端提供改变后的完整资源)
- DELETE(DELETE):从服务器删除资源
- PATCH(UPDATE WHERE):在服务器部分更新资源(客户端提供改变的属性)
- HEAD:获取资源的元数据
- OPTIONS:获取关于资源的哪些属性是客户端可以改变的信息
状态码
- 200:OK
「GET」服务器成功返回用户请求的数据
- 201:CREATED
「POST/PUT/PATCH」用户新建或修改数据成功
- 204:NO CONTENT
「DELETE」用户删除数据成功
- 400:INVALID REQUEST
「POST/PUT/PATCH」用户请求有误(请求参数有误)
- 401:Unauthorized
「*」用户没有权限(令牌,用户名,密码错误)
- 403:Forbidden
「*」表示用户得到授权(与401错误相对),但是访问是被禁止的
- 404:NOT FOUND
「*」用户请求路径不存在
- 500:INTERNAL SERVER ERROR
「*」服务器发生错误
接口设计
最原始设计
GET
- 从数据库中获取所有的项目信息
- 将数据库模型实例转化为字典类型「Json数组」「嵌套字典的列表」
- 注意:JsonResponse第一个参数默认只能为dict字典,如果要设为其他类型,需要将safe设为False
1 | # LearnDjango/projects/views.py |
1 | # LearnDjango/projects/urls.py |
1 | http http://127.0.0.1:8000/project/ |
POST
- 从前端获取json格式的数据,转化为Python中的类型
为了严谨性,这里需要做各种复杂的校验
比如:是否为json,传递的项目数据是否符合要求,有些必传参数是否携带
- 向数据库中新增项目
- 将模型类转化为字典,然后返回
1 | def post(self, request): |
1 | http POST http://127.0.0.1:8000/project/ name=10月11日「测试游记」 leader=zx tester=zx programer=zx publish_app=10月11日内容 desc=测试post请求 |
GET具体内容
- 校验前端传递的pk(项目ID)值,类型是否正确(正整数),在数据库中是否存在等「先省略」
- 获取指定pk值的项目
- 将模型类转化为字典,然后返回
1 | # projects/views.py |
1 | # projects/urls.py |
1 | http :8000/project/1/ |
PUT具体内容
- 校验前端传递的pk(项目ID)值,类型是否正确(正整数),在数据库中是否存在等「先省略」
- 获取指定pk值的项目
- 从前端获取json格式的数据,转化为Python中的类型
为了严谨性,这里需要做各种复杂的校验
比如:是否为json,传递的项目数据是否符合要求,有些必传参数是否携带
- 更新项目
- 将模型类转化为字典,然后返回
1 | def put(self, request, pk): |
1 | http PUT :8000/project/5/ name=10月11日「测试游记」 leader=zhongxin tester=zx programer=zx publish_app=10月11日内容 desc=测试post请求 |
DELETE
- 校验前端传递的pk(项目ID)值,类型是否正确(正整数),在数据库中是否存在等「先省略」
- 获取指定pk值的项目
- 删除
1 | def delete(self, request, pk): |
1 | http DELETE :8000/project/6/ |
原始设计小结
创建接口的任务
- 校验用户数据
- 将请求的数据(如json格式)转换为模型类对象
反序列化
- 将其他格式(json,xml等)转换为程序中的数据类型
- 将json格式的字符串转换为Django中的模型类对象
- 操作数据库
- 将模型类对象转换为响应的数据(如json格式)
序列化
- 将程序中的数据类型转换为其他格式(json,xml等)
- 例如将Django中的模型类对象转换为json字符串
数据增删改查流程
- 增
校验请求参数 -> 反序列化 -> 保存数据 -> 将保存的对象序列化并返回
- 删
判断要删除的数据是否存在 -> 执行数据删除
- 改
判断要修改的数据是否存在 -> 校验请求参数 -> 反序列化 -> 保存数据 -> 将保存的数据序列号并返回
- 查
查询数据库 -> 将数据序列化并返回
原始设计代码
1 | import json |