Postman和restful
# POSTMAN的使用****
API接口: 前后台信息交互的媒介
POSTMAN -- 接口测试工具postman还可以进行接口的批量测试, 导出导入测试文件..
下载地址: https://www.postman.com/downloads/
# web开发模式
python后端开发,提供API接口,返回Json格式的数据..
前后端不分离的混合开发模式 ; 前后端分离
2
# GET请求
?name=lqz&age=19 request.GET接收
# POST请求
★ Post请求携带的Body请求体里提交到后端的数据, 对其常用的<编码格式>有3种!
即POST以 什么样子/什么编码格式 组织数据提交到后端!
首先要明确!
POST的请求方式才会有请求体,GET请求是没有请求体的!!
POST请求的参数放在请求体里,无大小限制;GET请求的参数放到URL地址中,有大小限制(小于1k)!!
1> urlencoded(默认) -- request.POST
会用&符号作为分隔符组织多组k-v数据放到请求体中,提交到后端
eg: hobby=篮球&hobby=足球&aa=aa # -- 会对汉字篮球足球进行编码!
2> formdata -- 普通数据部分 request.POST; 文件部分 request.FILES
既可以传文件,又可以传普通数据
其在请求体中的格式如下(了解):
普通数据部分"name=egon&age=18" + 文件部分"先以--flakjfalk--作为分割,然后是文件的二进制数据"
有分割后,就能清楚的知道从哪开始读文件.
Ps:form表单元素在使用包含文件上传的表单控件时,必须给表单元素的enctype属性设置该值
3> json
json格式的数据直接放到请求体中
eg: {"name":"egon","age":19}
注意!POST请求提交到Django后端的json格式的数据,request.POST是接受不到的!!!
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 实验验证
创建Django项目drf_day01.并创建app01,写一个路由/index和对应的视图函数index.注释掉csrf中间件!
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^index/', views.index),
]
# --- # --- # --- # --- #
from django.shortcuts import render, HttpResponse
def index(request):
print("request.GET >>:", request.GET)
print("request.POST >>:", request.POST)
print("request.FILES >>:", request.FILES)
print("request.body >>:", request.body) # -- ★ 接收请求体里的内容
return HttpResponse('ok')
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# get
在POSTMAN中发送get请求,
http://127.0.0.1:8000/index/?name=lqz&name=dc
,后端结果如下:
request.GET >>: <QueryDict: {'name': ['lqz', 'dc']}>
request.POST >>: <QueryDict: {}>
request.FILES >>: <MultiValueDict: {}>
request.body >>: b''
思考:若将request.GET的结果看作一个字典,按照字典的规则,request.GET.get('name')得到的应该是['lqz','dc']
然而真实得到的是'dc',So,request.GET可以当作字典用,但实际上它不是个字典!!
print(request.GET.get('name')) # dc -- 取到的是最后一个
print(request.GET.getlist('name')) # ['lqz', 'dc']
补充: request.GET肯定是某个类的实例化对象!通过type(request.GET)查看该实例对应的类!
print(type(request.GET)) # <class 'django.http.request.QueryDict'>
from django.http.request import QueryDict
command+b查看QueryDict类的源码发现该类的父类继承了dict类!!So,它可以当作字典用,但比字典更强大!
实验证明,request.GET、request.POST都是QueryDict类的实例对象!!request.FILES是MultiValueDict类的实例.
***
扩展作业,我们也能实现类似的功能,写一个类,用起来跟字典一样,但是要有obj.getlist方法.get取最后一个,getlist取所有.
-- 继承dict
-- 重写__getattr__方法,点拦截
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# urlencoded
在POSTMAN中发送post请求,
http://127.0.0.1:8000/index/?name=lqz&name=dc
;
并在body请求体中添加urlencoded格式的数据,后端结果如下:
request.GET >>: <QueryDict: {'name': ['lqz', 'dc']}>
request.POST >>: <QueryDict: {'hobby': ['篮球'], 'aa': ['aa']}>
request.FILES >>: <MultiValueDict: {}>
request.body >>: b'hobby=%E7%AF%AE%E7%90%83&aa=aa' # -- 对汉字篮球进行了编码
2
3
4
# formdata
注意: 如果传的是文件, body体是不能被打印的!! 打印会报错.
request.GET >>: <QueryDict: {'name': ['lqz', 'dc']}>
request.POST >>: <QueryDict: {'name': ['路飞']}>
request.FILES >>: <MultiValueDict: {'myfile': [
<InMemoryUploadedFile: 111.jpg (image/jpeg)>,
<InMemoryUploadedFile: 222.jpg (image/jpeg)>]}>
2
3
4
5
# json
注意: request.POST是取不到json格式的数据的!!
request.GET >>: <QueryDict: {'name': ['lqz', 'dc']}>
request.POST >>: <QueryDict: {}>
request.FILES >>: <MultiValueDict: {}>
request.body >>: b'{"name":"egon","age":19}'
2
3
4
为什么request.POST是取不到json格式的数据?
因为Django的开发者没有写!!他只写了urlencoded和formdata格式的, json格式数据的接收需要我们自己写!!
我们可以写一个装饰器,加到视图函数上,无论前端 POST请求 传过来的数据是哪个格式的编码,Django都从request.data中获取!!
实现思路: 从request.body是否报错出发..
# 总结
1> GET请求 -- 在url中的表现形式?name=lqz&age=19
, Django后端通过request.GET
进行接收 -- QueryDict对象
2> POST请求分三种编码方式
编码格式 | 在body请求体中的存放形式 | Django中接收数据 |
---|---|---|
urlencoded | hobby=篮球&hobby=足球&aa=aa | request.POST -- QueryDict对象 |
formdata | 普通数据部分"hobby=篮球&hobby=足球&aa=aa" 文件部分"--flakjfalk--作为分割 + 文件的二进制数据" | 普通数据部分: request.POST -- QueryDict对象 文件数据部分: request.FILES -- MultiValueDict对象 若传的是文件, body体是不能被打印的,打印会报错 |
json | {"name":"egon","age":19} | Django中没有写好的对象来接收,需要自己写 |
3> request.GET、request.POST、request.FILES 对象都可以接收key值相同的多个数据!!
取的时候,obj.get取最后一个,obj.getlist取所有!!
Ps: 之所以没有展示上传文件,因为上传文件的话,request.body打印不了!
# restful规范*****
RESTful是一种定义 API接口的设计风格 , 尤其适用于前后端分离的应用模式中!! 共有10条!
1. 保证数据安全,通常使用https进行交互!
https比http安全,https=http+ssl
2. 接口中带api关键字来表示该url是api接口
https://api.baidu.com
https://www.baidu.com/api
3. url链接中带接口版本
https://api.baidu.com/v1
https://api.baidu.com/v2
举个例子,刚开始登陆只需要用户和密码,上线积累一些用户后,现登陆功能需要加上验证码
为了保证已有用户能使用老版本的登陆,新开放一个v2版本的登陆接口.
4. ★ 数据即是资源,均使用名词(可复数)
eg:取所有的图书
https://api.baidu.com/v1/books (☑️)
https://api.baidu.com/v1/get_books (❌)
一般提倡用资源的复数形式,在url链接中<尽量>不要出现操作资源的动词
5. ★ 资源操作由请求方式决定(method)
1> 获取数据 get
2> 新增数据 post
3> 删除数据 delete
4> 修改数据 put/patch put是全局修改,patch是局部修改
https://api.baidu.com/books-get 获取所有图书
https://api.baidu.com/books/1-get 获取主键为1的图书
https://api.baidu.com/books/1-delete 删除主键为1的图书
6. 在url中带搜索、过滤、排序条件
https://api.example.com/v1/zoos?page=2&per_page=100 指定第几页,以及每页的记录数
https://api.example.com/v1/zoos?sortby=name&order=asc 指定返回结果按照哪个属性排序,以及排序顺序
7. 响应中带状态码
1> http响应中自带状态码:
1开头请求正在处理;2开头请求成功;3开头重定向;4开头客户端错误;5开头服务端错误.
200 -- 常规请求成功
201 -- 创建成功
301 -- 永久重定向,表示访问的资源永久不在啦
302 -- 暂时重定向
403 -- 请求无权限
404 -- 请求路径不存在
405 -- 请求方法不存在
500 -- 服务器异常
2> 返回的json数据中也带状态码!根据业务需求自己定制的!
8. 响应的json格式的数据中带错误信息
eg: {"code":1000,"msg":"缺少必要字段"}
9. 针对不同操作,服务器向用户返回的结果应该符合以下规范
GET /book :返回资源对象的列表(数组)
GET /books/1 :返回单个资源对象
POST /books :返回新生成的资源对象
PUT /books/2 :返回完整的资源对象
PATCH /books/2 :返回完整的资源对象
DELETE /books/1 :返回一个空文档
10.响应中带链接
eg: 图片的链接地址
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# 序列化和反序列化**
api接口开发, 最核心最常见的一个过程就是序列化, 所谓序列化就是把 数据转换格式 , 序列化可以分两个阶段:
序列化:
把我们的数据转换成别人指定的格式提供给他. eg: dict --> json
反序列化:
把别人提供的数据(一般为json格式)转换/还原成我们需要的格式. eg: json --> dict
# drf介绍和安装**
drf(Django REST framework) 是django的一个 第三方app.
使用它可以快速的写出符合restful规范的接口!
注意,最新版本的drf不支持Django1.x啦!! So,接下来的Django项目我们都使用Django2.x..
先升级pycharm里的Django版本为2.2.2.. 再安装djangorestframework==3.12.4 ...
(注意,升级完后,Django1.x的项目什么都不用改,是向下兼容,可以使用的!!)
Django2.x的版本路由就不推荐用url啦,推荐用path和url_path!! from django.urls import path,re_path
DRF的特点如下:
提供了定义序列化器Serializer的方法,可以快速根据 Django ORM 或者其它库自动序列化/反序列化;
提供了丰富的类视图、Mixin扩展类,简化视图的编写;
丰富的定制层级:函数视图、类视图、视图集合到自动生成 API,满足各种需要;
多种身份认证和权限认证方式的支持;[jwt]
内置了限流系统;
直观的 API web 界面;
可扩展性,插件丰富
2
3
4
5
6
7