API 接口

海棠未雨,梨花先雪,一半春休 / 2023-08-28 / 原文

一、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&region=%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)