1. 程式人生 > 其它 >python介面自動化44- requests 庫使用 hook 機制

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())