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)
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章