requests庫是用來發送請求的庫,本篇用來講解requests庫的基本使用。
1.安裝requests庫
pip install requests
2.requests庫底層方法的調用邏輯
(1)get / post / put / delete 四種方法底層調用 request方法
注意:data和json都可以作為Post請求的參數,但是使用時機不同。當傳參是json類型時,使用json,當傳參是文件時使用files,其他時候使用data。
(2)request方法底層調用session.request方法
(3)因為get / post / put / delete 四種方法不能對有cookie關聯的接口進行自動關聯,而session.request方法可以進行自動管理,所以常用session.request方法發送請求。
3.session.request方法的參數,常用的有:
參數 | 說明 |
---|---|
method | 請求方法 |
url | 請求路徑 |
params=None | get請求傳參 |
data=None | post或put請求傳參 |
json=None | post請求傳參 |
headers=None | 請求頭 |
cookies=None | Cookie |
files=None | 文件上傳 |
4.接收響應
session.request方法發送請求后會返回響應,接收響應時需要根據響應的類型來接收:
接收方式 | 說明 |
---|---|
res.text | 返回文本信息 |
res.json() | 返回json格式 |
res.content | 返回的字節內容 |
res.status_code | 返回的狀態碼 |
res.reason | 返回的狀態信息 |
res.cookies | 返回的coolie |
res.encoding | 返回的編碼格式 |
res.headers | 返回的響應頭 |
5.接口關聯
當后一個接口的參數需要從前一個接口的響應數據中獲取時,就需要進行接口關聯。
實現接口關聯有三種方式:
- 通過類變量保存中間變量
- 通過單獨文件保存中間變量
- 極限封裝成工具一樣,只需要通過表達式
首先說明如何通過類變量保存中間變量?
只需要從前一個接口中提取到變量設置為類變量,就可以通過類名在第二個接口中調用了。
class Testapi:access_token = ""
而從響應中提取變量有兩種方式:
- 正則表達式提取(適用于提取文本結果)
- JsonPath提取 (適用于提取json結果)
正則表達式提取變量的方法有兩種:
- re.search() 提取單個值,通過下標取值
- re.findall() 提取多個值,通過下標取值
re.search(表達式,對象)
result = res.text
Testapi.access_token = re.search('xxx(.*?)xxx',result).group(1)
JsonPath提取變量只有一個方法:
jsonpath.jsonpath(對象,表達式)
result = res.json()
value = jsonpath.jsonpath(result,”$.access_token”)
jsonPath表達式規則:
規則 | 解釋 |
---|---|
$ | 根節點 |
. | 子節點 |
… | 遞歸取子節點 |
[] | 代表取列表中的值,下標從0開始 |
6.統一的請求封裝
請求四要素:請求方法、請求路徑、請求參數、請求頭
響應四要素:響應碼、響應信息、響應內容、響應頭
所有請求的發送都是組織請求四要素然后發送,這種相同類型的操作可以進行統一的封裝,減少冗余代碼,同時可以對請求進行統一管理,如統一異常處理,統一日志監控。
在統一封裝請求時,可以直接將參數傳遞給session.request()方法的可變長度參數,就不需要考慮參數的類型了。
# 封裝
class RequestUtils:sess = requests.session();# 統一發送請求def all_send_request(self,**kwargs):res = RequestUtils.sess.request(**kwargs)print(kwargs["method"])#獲取請求方式return res
class Testapi:# 調用def test_file_upload(self):url=""datas={"meida":open("E:\\111.png","rb")} # 文件的字節流res = RequestUtils().all_send_request(method="post",url=url,files=datas)
封裝之后會發現第一種通過類變量保存中間變量,在跨文件使用時會導致用例出錯。
為了解決這個問題,我們可以使用第二種方法:通過單獨的文件保存中間變量,來實現接口關聯。