<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
前言:
我們在做自動化測試的時候,大家都是希望自己寫的程式碼越簡潔越好,程式碼重複量越少越好。那麼,我們可以考慮將request的請求型別(如:Get、Post、Delect請求)都封裝起來。這樣,我們在編寫用例的時候就可以直接進行請求了。
我們先來看一下Get、Post、Delect等請求的原始碼,看一下它們都有什麼特點。
(1)Get請求原始碼
def get(self, url, **kwargs): r"""Sends a GET request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. :param **kwargs: Optional arguments that ``request`` takes. :rtype: requests.Response """ kwargs.setdefault('allow_redirects', True) return self.request('GET', url, **kwargs)
(2)Post請求原始碼
def post(self, url, data=None, json=None, **kwargs): r"""Sends a POST request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. :param data: (optional) Dictionary, list of tuples, bytes, or file-like object to send in the body of the :class:`Request`. :param json: (optional) json to send in the body of the :class:`Request`. :param **kwargs: Optional arguments that ``request`` takes. :rtype: requests.Response """ return self.request('POST', url, data=data, json=json, **kwargs)
(3)Delect請求原始碼
def delete(self, url, **kwargs): r"""Sends a DELETE request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. :param **kwargs: Optional arguments that ``request`` takes. :rtype: requests.Response """ return self.request('DELETE', url, **kwargs)
(4)分析結果
我們發現,不管是Get請求、還是Post請求或者是Delect請求,它們到最後返回的都是request函數。那麼,我們再去看一看request函數的原始碼。
def request(self, method, url, params=None, data=None, headers=None, cookies=None, files=None, auth=None, timeout=None, allow_redirects=True, proxies=None, hooks=None, stream=None, verify=None, cert=None, json=None): """Constructs a :class:`Request <Request>`, prepares it and sends it. Returns :class:`Response <Response>` object. :param method: method for the new :class:`Request` object. :param url: URL for the new :class:`Request` object. :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`. :param data: (optional) Dictionary, list of tuples, bytes, or file-like object to send in the body of the :class:`Request`. :param json: (optional) json to send in the body of the :class:`Request`. :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`. :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`. :param files: (optional) Dictionary of ``'filename': file-like-objects`` for multipart encoding upload. :param auth: (optional) Auth tuple or callable to enable Basic/Digest/Custom HTTP Auth. :param timeout: (optional) How long to wait for the server to send data before giving up, as a float, or a :ref:`(connect timeout, read timeout) <timeouts>` tuple. :type timeout: float or tuple :param allow_redirects: (optional) Set to True by default. :type allow_redirects: bool :param proxies: (optional) Dictionary mapping protocol or protocol and hostname to the URL of the proxy. :param stream: (optional) whether to immediately download the response content. Defaults to ``False``. :param verify: (optional) Either a boolean, in which case it controls whether we verify the server's TLS certificate, or a string, in which case it must be a path to a CA bundle to use. Defaults to ``True``. :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair. :rtype: requests.Response """ # Create the Request. req = Request( method=method.upper(), url=url, headers=headers, files=files, data=data or {}, json=json, params=params or {}, auth=auth, cookies=cookies, hooks=hooks, ) prep = self.prepare_request(req) proxies = proxies or {} settings = self.merge_environment_settings( prep.url, proxies, stream, verify, cert ) # Send the request. send_kwargs = { 'timeout': timeout, 'allow_redirects': allow_redirects, } send_kwargs.update(settings) resp = self.send(prep, **send_kwargs) return resp
從request原始碼可以看出,它先建立一個Request,然後將傳過來的所有引數放在裡面,再接著呼叫self.send(),並將Request傳過去。這裡我們將不在分析後面的send等方法的原始碼了,有興趣的同學可以自行了解。
分析完原始碼之後發現,我們可以不需要單獨在一個類中去定義Get、Post等其他方法,然後在單獨呼叫request。其實,我們直接呼叫request即可。
程式碼範例:
import requests class RequestMain: def __init__(self): """ session管理器 requests.session(): 維持對談,跨請求的時候儲存引數 """ # 範例化session self.session = requests.session() def request_main(self, method, url, params=None, data=None, json=None, headers=None, **kwargs): """ :param method: 請求方式 :param url: 請求地址 :param params: 字典或bytes,作為引數增加到url中 :param data: data型別傳參,字典、位元組序列或檔案物件,作為Request的內容 :param json: json傳參,作為Request的內容 :param headers: 請求頭,字典 :param kwargs: 若還有其他的引數,使用可變引數字典形式進行傳遞 :return: """ # 對異常進行捕獲 try: """ 封裝request請求,將請求方法、請求地址,請求引數、請求頭等資訊入參。 注 :verify: True/False,預設為True,認證SSL證書開關;cert: 本地SSL證書。如果不需要ssl認證,可將這兩個入參去掉 """ re_data = self.session.request(method, url, params=params, data=data, json=json, headers=headers, cert=(client_crt, client_key), verify=False, **kwargs) # 例外處理 報錯顯示具體資訊 except Exception as e: # 列印異常 print("請求失敗:{0}".format(e)) # 返回響應結果 return re_data if __name__ == '__main__': # 請求地址 url = '請求地址' # 請求引數 payload = {"請求引數"} # 請求頭 header = {"headers"} # 範例化 RequestMain() re = RequestMain() # 呼叫request_main,並將引數傳過去 request_data = re.request_main("請求方式", url, json=payload, headers=header) # 列印響應結果 print(request_data.text)
注 :如果你調的介面不需要SSL認證,可將cert與verify兩個引數去掉。
本文簡單的介紹了Python介面自動化之request請求封裝
到此這篇關於Python介面自動化之request請求封裝原始碼分析的文章就介紹到這了,更多相關Python request 內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45