美文网首页软件测试知识简友广场散文
BaseAPI业务基类封装优化思路

BaseAPI业务基类封装优化思路

作者: 小小一颗卤蛋 | 来源:发表于2022-11-21 22:56 被阅读0次

    封装思路:

    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)
     
    

    相关文章

      网友评论

        本文标题:BaseAPI业务基类封装优化思路

        本文链接:https://www.haomeiwen.com/subject/ggqgxdtx.html