python接口自动化44- requests 库使用 hook 机制

Posted 上海-悠悠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python接口自动化44- requests 库使用 hook 机制相关的知识,希望对你有一定的参考价值。

前言

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 <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类,重写几个属性和方法

# 作者-上海悠悠 微信/QQ交流:283340479
# blog地址 https://www.cnblogs.com/yoyoketang/
import requests


def decrypt_response(response, *args, **kwargs):
    # print(response.text) 原始数据

    class NewResponse:
        text = '"code": 0, "data": "token": "yo yo"'  # response.text解密
        history = response.history
        raw = response.raw
        is_redirect = response.is_redirect
        content = b'"code": 0, "data": "token": "yo yo"'  # response.text解密
        elapsed = response.elapsed

        @staticmethod
        def json():
            # 拿到原始的response.json() 后解码
            return "code": 0, "data": "token": "yo yo"

    return NewResponse


url = "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 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.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

以上是关于python接口自动化44- requests 库使用 hook 机制的主要内容,如果未能解决你的问题,请参考以下文章

python 结合 requests库实现接口自动化测试

python接口自动化-requests库优化重构requests方法

python WEB接口自动化测试之requests库详解

基于Python+Requests库封装发送接口请求的工具类Python+Requests库做接口自动化框架设计系列多测师

基于Python+Requests库封装发送接口请求的工具类Python+Requests库做接口自动化框架设计系列多测师

python+pytest接口自动化-requests发送get请求