记录request库的部分封装

仅供参考

github找的框架,基于他的代码做了一部分改动,下面着重代码的解析和一些其他的完善。记录下来主要用于后续自己再做改动。 

import requests
import json as complexjson
from common.logger import logger

class RestClient():

    def __init__(self, api_root_url):
        self.api_root_url = api_root_url
        self.session = requests.session()

    def get(self, url, **kwargs):
        return self.request(url, "GET", **kwargs)

    def post(self, url, data=None, json=None,files=None, **kwargs):
        if files is not None:
            return self.request(url, "POST", data=data,files=files, **kwargs)
        else:
            return self.request(url, "POST", data=data, json=json,**kwargs)

    def put(self, url, data=None, **kwargs):
        return self.request(url, "PUT", data, **kwargs)

    def delete(self, url, **kwargs):
        return self.request(url, "DELETE", **kwargs)

    def patch(self, url, data=None, **kwargs):
        return self.request(url, "PATCH", data, **kwargs)

    def request(self, url, method, data=None, json=None,files=None, **kwargs):
        url = self.api_root_url + url
        headers = dict(**kwargs).get("headers")
        params = dict(**kwargs).get("params")
        #files = dict(**kwargs).get("params")
        cookies = dict(**kwargs).get("cookies")
        self.request_log(url, method, data, json, params, headers, files, cookies)
        if method == "GET":
            return self.session.get(url, **kwargs)
        if method == "POST":
            if files is not None:
                return self.session.post(url, data=data, files=files, **kwargs)
            else:
                return self.session.post(url, data=data, json=json, **kwargs)
        if method == "PUT":
            if json:
                # PUT 和 PATCH 中没有提供直接使用json参数的方法,因此需要用data来传入
                data = complexjson.dumps(json)
            return self.session.put(url, data, **kwargs)
        if method == "DELETE":
            return self.session.delete(url, **kwargs)
        if method == "PATCH":
            if json:
                data = complexjson.dumps(json)
            return self.session.patch(url, data, **kwargs)

    def request_log(self, url, method, data=None, json=None, params=None, headers=None, files=None, cookies=None,
                    **kwargs):
        logger.info("接口请求地址 ==>> {}".format(url))
        logger.info("接口请求方式 ==>> {}".format(method))
        logger.info("接口请求头 ==>> {}".format(complexjson.dumps(headers, indent=4, ensure_ascii=False)))
        logger.info("接口请求 params 参数 ==>> {}".format(complexjson.dumps(params, indent=4, ensure_ascii=False)))
        logger.info("接口请求体 data 参数 ==>> {}".format(
            complexjson.dumps(data, indent=4, ensure_ascii=False) if data else 'None'))
        logger.info("接口请求体 json 参数 ==>> {}".format(
            complexjson.dumps(json, indent=4, ensure_ascii=False) if json else 'None'))
        if files:
            logger.info("接口上传附件 files 参数 ==>> {} (file names and types)".format([f for f in files.keys()]))
        else:
            logger.info("接口上传附件 files 参数 ==>> None")
        logger.info("接口 cookies 参数 ==>> {}".format(
            complexjson.dumps(cookies, indent=4, ensure_ascii=False) if cookies else 'None'))

定义了一个RestClient类,用于发送HTTP请求到指定的API根URL。该类支持GET、POST、PUT、DELETE和PATCH等HTTP方法。它使用requests库来发起请求,并提供了一个日志记录器来记录每次请求的详细信息。
__init__方法初始化RestClient实例,接受一个api_root_url参数,用于构造请求的完整URL。
get方法发送一个GET请求到指定的URL。
post方法发送一个POST请求到指定的URL,可以传入数据、JSON和文件。
put方法发送一个PUT请求到指定的URL,可以传入数据。
delete方法发送一个DELETE请求到指定的URL。
patch方法发送一个PATCH请求到指定的URL,可以传入数据。
request方法是上述所有HTTP方法的底层实现。它根据不同的HTTP方法构造请求,并使用session对象发送请求。该方法还支持传入额外的参数,如headers、params和cookies等。
request_log方法用于记录请求的详细信息,包括URL、HTTP方法、请求头、请求参数、请求体等。
总的来说,这个RestClient类提供了一个方便的方法来发送HTTP请求,并记录请求的详细信息,方便调试和监控。

后续接口的使用

class Register(RestClient):

    def __init__(self, api_root_url, **kwargs):
        super(Register, self).__init__(api_root_url, **kwargs)


    def register(self, **kwargs):
        """
        执行注册操作。
        通过向“register”端点发送POST请求来实现用户注册。
        参数:
        **kwargs: 动态接收传入的关键字参数,这些参数将被添加到POST请求的数据中。
        返回值:
        发送POST请求后的响应对象。具体的响应内容依赖于后端的实现。
        """
        return self.post("/register", **kwargs)

这里的super(Register, self).__init__(api_root_url, **kwargs)的作用是确保Register类的实例在创建时,不仅设置了自己的属性(如果有的话),还正确地初始化了从RestClient继承来的所有属性和进行了必要的配置设置。通过**kwargs,可以灵活地向RestClient的构造函数传递任何额外的配置信息,增强了类的灵活性和重用性。

 

1.对于非cookie和sessionid的系统,比如token的管理

import requests

# 创建Session实例
session = requests.Session()

# 设置Token(这里以Bearer Token为例)
token = "your_token_here"
session.headers.update({"Authorization": f"Bearer {token}"})

# 现在,任何通过这个session实例发出的请求都会自动包含Authorization头
response = session.get("https://api.example.com/data")

# 打印响应内容
print(response.text)

考虑在request中加入变量,根据变量值区分是否需要自动更新headers。其中Authorization是项目中用于校验的token。

下面是对于这部分代码的解读。通过session.headers.update()方法添加了一个自定义的请求头——Authorization,其值为Bearer {token},这里Bearer是一种常见的Token认证方案的类型,后面跟着的是实际的Token字符串。这样设置后,通过这个session发出的所有请求都会自动在请求头中包含这个Token信息,实现认证目的。

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值