API 接口
一、API 简介
1、前后端分离项目中
为了在团队内部形成共识、防止个人习惯差异引起的混乱,我们需要找到一种大家都觉得很好的接口实现规范,而且这种规范能够让后端写的接口,用途一目了然,减少双方之间的合作成本
2、url和接口的区别
Web API接口和一般的url链接还是有区别的,Web API接口简单概括有下面四大特点
1. url:长得像返回数据的url链接
https://api.map.baidu.com/place/v2/search
2. 请求方式:get、post、put、patch、delete
采用get方式请求上方接口
3. 请求参数:json或xml格式的key-value类型数据
ak:6E823f587c95f0148c19993539b99295 region:上海 query:肯德基 output:json
4. 响应结果:json或xml格式的数据
https://api.map.baidu.com/place/v2/search?ak=6E823f587c95f0148c19993539b99295®ion=%E4%B8%8A%E6%B5%B7&query=%E8%82%AF%E5%BE%B7%E5%9F%BA&output=json
3、 典型的api接口长这样
- url地址
- 有请求方式
- 携带参数
- 返回格式是json,xml
二、练习题
1、写一个demo使用postman测试
-1 传用户名密码到后端,查询数据库,都对了---》返回json格式{code:100,msg:登录成功}---》urlencoded
-2 打印 request.POST
-3 打印 request.body
-4 传文件到后方
from django.views.decorators.csrf import csrf_exempt @csrf_exempt def api(request): if request.method == 'POST': name = request.POST.get('name') phone = request.POST.get('phone') file = request.FILES.get('file') print(file) # print(request.body) 大文件不能获取到二进制数据,因为http基于TCP流式协议,容易发生沾包 res = models.UserInfo.objects.filter(username=name, phone=phone).first() if res: print(name, phone) print(request.POST) # <QueryDict: {'name': ['jingzhiz'], 'phone': ['123123']}> print(request.body) # b'name=jingzhiz&phone=123123' dict_back = {'code': 200, 'msg': '后端返回数据: 用户名和电话验证成功!'} return JsonResponse(dict_back) elif file: dict_back = {'code': 200, 'msg': '后端返回数据: 上传文件成功!'} return JsonResponse(dict_back) else: dict_back = {'code': 200, 'msg': '后端返回数据:用户名和电话验证失败!'} return JsonResponse(dict_back)
注:
1. @csrf_exempt 装饰器是绕过csrf验证
2. request.body 不能取到大文件数据,因为http基于TCP流式协议,容易发生沾包
2、当前端发送json格式数据时候,request.POST 取不到。使用request.body拿数据
-request.data 默认没有---》(装饰器)--->无论前端什么格式:josn,urlencoded---》后端取出来是字典
def auth(func): def inner(request, *args, **kwargs): if request.POST: # 传json的时候,这里为空 request.data = request.POST res = func(request, *args, **kwargs) return res else: # 传json request.data = json.loads(request.body) # 反序列化 return func(request, *args, **kwargs) return inner @csrf_exempt @auth def js(request): dict_back = {'name': request.data.get('name'), 'age': request.data.get('age')} return JsonResponse(dict_back)