python接口自动化44- requests 库使用 hook 机制
创始人
2024-03-05 16:02:08

前言

requests 是 Hooks 即钩子方法,用于在某个框架固定的某个流程执行是捎带执行(钩上)某个自定义的方法。
requests 库只支持一个 response 的钩子,即在响应返回时可以捎带执行我们自定义的某些方法。
可以用于打印一些信息,做一些响应检查或想响应对象中添加额外的信息

使用示例

requests 库只支持一个 response 的钩子,即在响应返回时可以捎带执行我们自定义的某些方法.

# 作者-上海悠悠 微信/QQ交流:283340479
# blog地址 https://www.cnblogs.com/yoyoketang/
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 aserver's response to an HTTP request."""__attrs__ = ["_content","status_code","headers","url","history","encoding","reason","cookies","elapsed","request",]

可以自己定义一个NewResponse类,重写几个属性和方法

# 作者-上海悠悠 微信/QQ交流:283340479
# blog地址 https://www.cnblogs.com/yoyoketang/
import requestsdef decrypt_response(response, *args, **kwargs):# print(response.text) 原始数据class NewResponse:text = '{"code": 0, "data": {"token": "yo yo"}}'  # response.text解密history = response.historyraw = response.rawis_redirect = response.is_redirectcontent = b'{"code": 0, "data": {"token": "yo yo"}}'  # response.text解密elapsed = response.elapsed@staticmethoddef json():# 拿到原始的response.json() 后解码return {"code": 0, "data": {"token": "yo yo"}}return NewResponseurl = "https://www.cnblogs.com/yoyoketang/"
r = requests.get(url, hooks={"response": decrypt_response})
print(r.text)
print(r.content)
print(r.json())

运行结果

{"code": 0, "data": {"token": "yo yo"}}
b'{"code": 0, "data": {"token": "yo yo"}}'
{'code': 0, 'data': {'token': 'yo yo'}}

调用多个函数

response 可以调用多个hook函数

import requestsdef 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.cnblogs.com/yoyoketang/"s = requests.Session()
s.hooks.update({"response": decrypt_response})
r = s.get(url)
print(r.text)
print(r.content)
print(r.json())

这样只需在session会话中添加hook机制,后面的请求都会自动带上了

比较遗憾的是,只提供了一个response对象的hook机制, 没法对请求对象设置hook

相关内容

热门资讯

猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...