網站首頁 編程語言 正文
前言:
我們在做自動化測試的時候,大家都是希望自己寫的代碼越簡潔越好,代碼重復量越少越好。那么,我們可以考慮將request的請求類型(如:Get、Post、Delect請求)都封裝起來。這樣,我們在編寫用例的時候就可以直接進行請求了。
1. 源碼分析
我們先來看一下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即可。
2. requests請求封裝
代碼示例:
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兩個參數去掉。
3. 總結
本文簡單的介紹了Python接口自動化之request請求封裝
原文鏈接:https://juejin.cn/post/6972379762471731230
相關推薦
- 2023-02-06 python常見讀取語音的3種方法速度對比_python
- 2022-12-27 pytorch?K折交叉驗證過程說明及實現方式_python
- 2022-04-06 C/C++的內存管理你了解嘛_C 語言
- 2022-05-06 python使用xlrd模塊讀取excel的方法實例_python
- 2022-10-12 golang中隨機數rand的使用_Golang
- 2022-07-29 C++超詳細講解操作符的重載_C 語言
- 2022-08-15 centos7 進行Python3.9 Django3項目遷移啟動asgi
- 2022-12-23 Mariadb數據庫主從復制同步配置過程實例_mariadb
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支