基于request库的简单封装

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()

参考文档:
python 通过 实例方法 名字的字符串调用方法
Python接口自动化之requests请求封装

你可能感兴趣的:(基于request库的简单封装)