BaseAPI业务基类封装优化思路 封装思路: 优化版本如下:

封装思路:

1、在一个业务类里面,怎么使用token?

  • 场景:每一个接口都需要传递token,但是不希望每一个都去穿token--->可以使用---> def init() 做到(如果不用改方法,自己写,则需要每个都调用)
    2、在业务类中,怎么使用token?可以全部卸载baseAPI中,后续的类继承即可获取
    3、把一些常规的接口封装在基类中
    4、如果登录模块不需要token,怎么处理?

优化版本如下:

"""
封装思路:
    1- 为所有的业务模块提供的基本接口操作:增删改查+发送接口
    2- 日志  截图都可以在基类里封装
    3- 断言方法
@log装饰器
def login():
    try:
        xxxxx
    except:
        log.error()
 
"""
#---------------封装的思路启发--------------
"""
发送公共请求方法:
    def request_send(self,method,url):
        - 实际调用发送方法必须传递2个参数,
        - 每一个接口的数据还不一样
        - 反馈:很麻烦
    优化:
        思路:代码与配置分离
        实施:method url 可以放到一个配置文件  apiPathConfig.yml
        难点:代码怎么可以识别到对应的模块、对应的接口、对应的参数
        场景分类:
            - 常规风格的接口格式
                - 方法举例: 增加数据接口: post  ;修改也是 post
                - url举例:增加接口 /sq    修改 /sq_xintian/{id}
                 
            - restful接口风格
                - 方法规则:get  post  delete  put
                - url规范: 一样的
"""
import requests
from utils.handle_yaml import get_yaml_data
import inspect
from configs.config import HOST
class BaseAPI:
    def __init__(self,token=None):
        if token:#需要token业务
            self.header = {'Authorization': token}
        else:#登录业务
            self.header = None
        #获取对应模块的接口信息
        self.data = get_yaml_data('../configs/apiPathConfig.yml')[self.__class__.__name__]#根据类名去获取
        #print('类名是--->', self.__class__.__name__)
        #print('类接口数据--->', self.data)
 
    #---------发送的公共方法-每一个接口都会调用他----------
    def request_send(self,data=None,params=None,files=None,id=''):
        try:
            #api_data == {'path': '/account/sLogin', 'method': 'POST'}
            api_data = self.data[inspect.stack()[1][3]]
            resp = requests.request(
                method=api_data['method'],#方法
                url=f'{HOST}{api_data["path"]}{id}',#url
                data=data,
                params=params,
                files=files,
                headers=self.header)
            return resp.json()
        except:
            pass
    # 此处的放松方法包含了多种方式,如:
    #方法为post ,put,使用data,--新增/修改/更新
    #方法为get,使用params,--查询
    #方法为delete ,使用id--删除
    
    #------增删改查----------------------------
    def query(self,data):
        return self.request_send(params=data)
 
    #---增加数据接口---
    def add(self,data):
        return self.request_send(data=data)
 
    #---更新数据接口---
    def update(self,data):
        return self.request_send(data=data)
 
    #---删除数据接口---通过id
    def delete(self,id):
        return self.request_send(id=id)
    """
    第一种写法  shop/xt?id=100
    常见用法 shop/100
    """
    #------文件上传-----
    """
    Content-Disposition: form-data; name="file"; filename="QQ截图20200724100920.png"
Content-Type: image/png
     
    文件上传格式: 文件路径、文件名、文件类型
    路径: xx/123.png
    {‘file’:(文件名,文件对象本身,文件类型)}---转化
    {‘file’:('123.png',open('xx/123.png','rb'),'png')}
    """
    def file_upload(self,file_path:str):
        #1-获取文件名
        file_name = file_path.split('/')[-1]
        #2-文件类型
        file_type = file_path.split('.')[-1]
        file = {'file':(file_name,open(file_path,'rb'),file_type)}
        #3-发送请求
        return self.request_send(files=file)
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章