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)