封裝思路:
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)