封装思路:
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)
网友评论