仅供参考
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信息,实现认证目的。