美文网首页
基于request库的简单封装

基于request库的简单封装

作者: 张小Di | 来源:发表于2020-12-31 15:07 被阅读0次

    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库的简单封装

          本文链接:https://www.haomeiwen.com/subject/ysyaqktx.html