requests 库只支持一个 response 的钩子,即在响应返回时可以捎带执行我们自定义的某些方法。
requests 是 Hooks 即钩子方法,用于在某个框架固定的某个流程执行是捎带执行(钩上)某个自定义的方法。
可以用于打印一些信息,做一些响应检查或想响应对象中添加额外的信息
实战例子
requests 库只支持一个 response 的钩子,即在响应返回时可以捎带执行我们自定义的某些方法。
import requests
url = 'https://httpbin.org/get'
def response_status(resopnse, *args, **kwargs):
print('url', resopnse.url)
resopnse.status = 'PASS' if resopnse.status_code < 400 else 'FAIL'
res = requests.get(url, hooks={'response': response_status})
print(res.status)
执行结果
url https://httpbin.org/get
PASS
重写响应内容
在做接口自动化测试的时候,有时候会遇到响应的内容是加密的内容,需要对返回的内容先解密再输出加密后的内容,这样方便断言
以下是requests 库的 Response 部分源码
class Response:
"""The :class:`Response ` object, which contains a
server's response to an HTTP request.
"""
__attrs__ = [
"_content",
"status_code",
"headers",
"url",
"history",
"encoding",
"reason",
"cookies",
"elapsed",
"request",
]
可以自己定义一个NewResponse类,重写几个属性和方法
import requests
def decrypt_response(response, *args, **kwargs):
# print(response.text) 原始数据
class NewResponse:
text = '{"code": 0, "data": {"token": "mo"}}' # response.text解密
history = response.history
raw = response.raw
is_redirect = response.is_redirect
content = b'{"code": 0, "data": {"token": "mo"}}' # response.text解密
elapsed = response.elapsed
@staticmethod
def json():
# 拿到原始的response.json() 后解码
return {"code": 0, "data": {"token": "mo"}}
return NewResponse
url = "https://www.xxxx.com/"
r = requests.get(url, hooks={"response": decrypt_response})
print(r.text)
print(r.content)
print(r.json())
运行结果
{"code": 0, "data": {"token": "mo"}}
b'{"code": 0, "data": {"token": "mo"}}'
{'code': 0, 'data': {'token': 'mo'}}
调用多个函数
response 可以调用多个hook函数
import requests
def print_url(r, *args, **kwargs):
"""钩子函数1"""
print("raw_url "+r.url)
def change_url(r, *args, **kwargs):
"""钩子函数2"""
r.url = 'http://change.url'
print("changed_url "+r.url)
return r # 其实没有这句话,也可以修改r.url,因为r是response对象而非普通数值,但requests官方似乎误认为回调函数一定要有return才能替换传入的数据
url = 'http://httpbin.org/get'
response = requests.get(url, hooks=dict(response=[print_url, change_url]))
print("result_url "+response.url)
运行结果
raw_url http://httpbin.org/get
changed_url http://change.url
result_url http://change.url
全局会话hook
设置全局会话hook机制
url = "https://www.xxxxx.com/"
s = requests.Session()
s.hooks.update({"response": decrypt_response})
r = s.get(url)
print(r.text)
print(r.content)
print(r.json())
这样只需在session会话中添加hook机制,后面的请求都会自动带上了
下面是我整理的2023年最全的软件测试工程师学习知识架构体系图 |
心怀梦想,勇敢追寻。勤奋付出,成就非凡。困难不过是过程,坚持才是信念。奋斗的脚步,铸就辉煌。拼尽全力,点亮人生。激情燃烧,奋斗不止。踏上成功之路,追逐自由的舞台。
不畏困难,迎难而上。坚定信念,勇往直前。奋斗不止,成就非凡。努力耕耘,收获辉煌。信心满满,梦想必达。韶华虽短,但奋斗不息。永不放弃,追求卓越。
不要畏惧失败,积极迎接挑战。每一次努力都是成长的机会。坚持不懈,勇往直前。激发内心的激情,创造属于自己的辉煌。追逐梦想,奋力拼搏。执着追求,打造成功的人生。