requests库是一个非常优雅的库,仅通过一行代码就可实现对接口的调用,但是每个请求都写成单独的参数,这样的话,代码复用性较差,且不能实现参数化。那有没有比较简单的方式?是否可对requests库中的get/post进行二次封装呢?不仅可以实现参数化,也可在底层对异常进行处理,而不是在每个用例中去处理异常
定义一个通用方法,在调用的时候根据请求接口的请求类型判断用requests中的get/post?似乎可行,那试试吧。python 通过 实例方法 名字的字符串调用方法
方案一:
import requests,operator
from requests import Timeout,RequestException
class RequestHandler:
def _get(self):
try:
resp = requests.get(url=self.url, params=self.params, headers=self.headers)
if resp.status_code == 200:
return resp
else:
return "接口请求失败,返回错误的状态码:{}".format(resp.status_code)
except Timeout as e:
print("get请求超时:{}".format(e))
except RequestException as e:
print("get请求异常:{}".format(e))
except Exception as e:
print("get请求异常,出错原因:{}".format(e))
def _post(self):
try:
return requests.post(url=self.url, data=self.data, headers=self.headers)
except Exception as e:
print("post请求异常:{}".format(e))
def request(self):
"""
methodcaller传入两个参数,分别为字符串,表示映射的方法,另外一个参数为此方法运行参数
"""
self.resp = operator.methodcaller(f'_{self.method}')(self)
return self.resp
那是否还有其他方法呢,知己知彼方能百战不殆,那了解下request库中get/post的源码吧,方便后续封装和使用,源码如下:
request库中get方法:
def get(url, params=None, **kwargs):
kwargs.setdefault('allow_redirects', True)
return request('get', url, params=params, **kwargs)
request库中post方法:
def post(url, data=None, json=None, **kwargs):
return request('post', url, data=data, json=json, **kwargs)
我们看到,它们调用的都是通用方法request方法,那我们继续看下,:
def request(method, url, **kwargs)
with sessions.Session() as session:
return session.request(method=method, url=url, **kwargs)
可以看到返回的是session对象request方法返回的值,那么我们是否可以对session.request方法进行封装?
方案二:
import requests
class RequestHandler:
def __init__(self):
self.session = requests.session()
def request(self, method, url, params=None, data=None, json=None, headers=None, **kwargs):
return self.session.request(method, url, params=params, data=data, json=json, headers=headers, **kwargs)
def close_session(self):
self.session.close()
网友评论