文章目錄
- 前言
- Requests庫是什么
- 為什么要用Requests庫進行接口測試
- 安裝Requests庫
- Requests庫使用
- 發送GET請求
- 發送帶查詢參數的GET請求
- 響應內容格式
- 添加請求頭信息
- 發送一個POST請求
- 查看響應內容
- 斷言
- 請求超時
- Cookie與Session模擬登錄
- 參考目錄
前言
閱讀本文前請注意最后編輯時間,文章內容可能與目前最新的技術發展情況相去甚遠。歡迎各位評論與私信,指出錯誤或是進行交流等。
本文僅對Requests庫做了簡單的介紹,具體使用和更多內容請查看官網文檔,如果還有具體的使用問題可查詢更多其他資料,也歡迎在評論區留言。
Requests庫是什么
Requests是一個很實用的Python HTTP客戶端庫,編寫爬蟲和測試服務器響應數據時經常會用到,Requests官方中文文檔
為什么要用Requests庫進行接口測試
之前所學的Postman和Jmeter工具只需要通過點擊即可進行接口測試,操作簡單方便,結果直觀。但相比于代碼實現仍有一定的缺點:
- 工具讀取測試數據不靈活(無法直接讀取或存儲Json格式數據)
- 不方便測試加密數據
- 編寫復雜的業務邏輯與復雜斷言腳本較為麻煩
安裝Requests庫
在安裝了python的基礎上(python一般會帶有pip包),在命令提示符(CMD)中輸入即可。
$ pip install requests
獲得源碼
如果想要獲取Requests的源代碼,可以從github上的公共版本庫獲取到代碼。
git clone git://github.com/kennethreitz/requests.git
Requests庫使用
發送GET請求
#1、導入requuests包
import requests
#2、發送get請求
r = requests.get("http://www.baidu.com")
#3、打印結果
print(r)
print(r.status_code)
print(r.headers)
print(r.url)
print(r.cookies)
print(r.text)嘗試獲取百度網頁的信息。
>>> r = requests.get("http://www.baidu.com")
返回一個名為 r 的 Response 響應對象。我們可以從這個對象中獲取所有我們想要的信息。
發送帶查詢參數的GET請求
為 URL 的查詢字符串(query string)傳遞某種數據。如果你是手工構建 URL,那么數據會以鍵值對的形式置于 URL 中,跟在一個問號的后面。例如, httpbin.org/get?key=val。 Requests 使用 params 關鍵字參數,以一個字符串字典來提供這些參數。舉例來說,如果你想傳遞 key1=value1 和 key2=value2 到 httpbin.org/get ,那么你可以使用如下代碼:
payload = {‘key1’: ‘value1’, ‘key2’: ‘value2’}
r = requests.get(“http://httpbin.org/get”, params=payload)
通過打印輸出該 URL,你能看到 URL 已被正確編碼:
print(r.url)
http://httpbin.org/get?key2=value2&key1=value1
注意字典里值為 None 的鍵都不會被添加到 URL 的查詢字符串里。
你還可以將一個列表作為值傳入:
payload = {‘key1’: ‘value1’, ‘key2’: [‘value2’, ‘value3’]}
r = requests.get(‘http://httpbin.org/get’, params=payload)
print(r.url)
http://httpbin.org/get?key1=value1&key2=value2&key2=value3
響應內容格式
Requests 會自動解碼來自服務器的內容。大多數 unicode 字符集都能被解碼,可以使用 r.encoding 屬性來改變它:
r.encoding = 'utf-8‘
如果你改變了編碼,每當你訪問 r.text ,Request 都將會使用 r.encoding 的新值。
比如 HTTP 和 XML 自身可以指定編碼。這樣的話,你應該使用 r.content 來找到編碼,然后設置 r.encoding 為相應的編碼。這樣就能使用正確的編碼解析 r.text 了。
你也能以字節的方式訪問請求響應體,對于非文本請求:r.content
Requests 中也有一個內置的 JSON 解碼器,助你處理 JSON 數據:r.json()
獲取來自服務器的原始套接字響應:r.raw
添加請求頭信息
為請求添加 HTTP 頭部,傳遞一個 dict 給 headers 參數就可以了。
url = ‘https://api.github.com/some/endpoint’
headers = {‘user-agent’: ‘my-app/0.0.1’}
r = requests.get(url, headers=headers)
注意: 添加的header 的優先級低于某些特定的信息源,例如:
如果在 .netrc 中設置了用戶認證信息,使用 headers= 設置的授權就不會生效。而如果設置了 auth= 參數,.netrc的設置就無效了。
如果被重定向到別的主機,授權 header 就會被刪除。
代理授權 header 會被 URL 中提供的代理身份覆蓋掉。
更進一步講,Requests 不會基于添加 header 的具體情況改變自己的行為。只不過在最后的請求中,所有的 header 信息都會被傳遞進去。
發送一個POST請求
發送一些編碼為表單形式的數據給服務器,只需傳遞一個字典給 data 參數。數據字典在發出請求時會自動編碼為表單形式:
payload = {‘key1’: ‘value1’, ‘key2’: ‘value2’}
r = requests.post(“http://httpbin.org/post”, data=payload)
print(r.text)
還可以為 data 參數傳入一個元組列表。在表單中多個元素使用同一 key 的時候,這種方式尤其有效:
payload = ((‘key1’, ‘value1’), (‘key1’, ‘value2’))
r = requests.post(‘http://httpbin.org/post’, data=payload)
print(r.text)
data 參數接受編碼為 JSON 格式的數據,但要先將數據進行轉換
import json
url = ‘https://api.github.com/some/endpoint’
payload = {‘some’: ‘data’}
r = requests.post(url, data=json.dumps(payload))
還可以使用 json 參數直接傳遞,然后它就會被自動編碼
url = ‘https://api.github.com/some/endpoint’
payload = {‘some’: ‘data’}
r = requests.post(url, json=payload)
POST一個文件
url = ‘http://httpbin.org/post’
files = {‘file’: open(‘report.xls’, ‘rb’)}
r = requests.post(url, files=files)
關于上傳文件的高級用法請參考官方文檔高級用法一節。
查看響應內容
更多響應內容請查看官方文檔
斷言
接收返回的響應結果后,我們可以使用assert關鍵字來判斷返回的狀態碼是否為200:
assert response.status_code == 200
可以對返回的內容進行斷言。例如,我們可以使用assert關鍵字來判斷返回的JSON中的某個字段的值是否符合預期:
assert response.json()[‘field’] == ‘value’
如果實際結果不符合預期,斷言會失敗,程序會拋出異常。
除了使用assert關鍵字,我們還可以結合unittest框架中的斷言方法來進行斷言處理。
首先,我們需要導入unittest庫:
import unittest
例如,我們可以使用assertEqual()方法來判斷兩個值是否相等:
class TestAPI(unittest.TestCase):def test_response_status_code(self):response = requests.get(url)self.assertEqual(response.status_code, 200)
請求超時
為防止服務器不能及時響應,大部分發至服務器的請求都應該帶著 timeout 參數。在默認情況下,除非顯式指定了 timeout 值,requests 是不會自動進行超時處理的。如果沒有 timeout,你的代碼可能會掛起若干分鐘甚至更長時間。
requests 庫將一個請求超時分成了兩部分:
連接超時指的是在你的客戶端實現到遠端機器端口的連接時(對應的是connect()
_),Request 會等待的秒數。
一旦你的客戶端連接到了服務器并且發送了 HTTP 請求,讀取超時指的就是客戶端等待服務器發送請求的時間。
如下所示:只對timeout設置了一個值
r = requests.get(‘https://github.com’, timeout=5)
這一 timeout 值將會用作 connect 和 read 二者的和。
如果要分別制定,就傳入一個元組:
r = requests.get(‘https://github.com’, timeout=(3.05, 27))
Cookie與Session模擬登錄
Cookie:利用headers參數,將抓包獲取的 Cookie 放到 headers 參數中
headers={"Cookie":"手動抓取的 Cookie ","User-Agent":"" }html=request.get(url=url,headers=header).text
Session:
import requests
def run():headers = {'User-Agent': 'ozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36'}data = {'username': 'xxxx','password': 'xxxx'}# 實例化 session 對象session = requests.session()# 使用session發送請求,登錄網站,返回的cookie保存其中session.post('https://passport.baidu.com/center', headers=headers, data=data)# 使用由session對象請求需要登錄才能訪問的頁面,得到信息返回 r = session.get(url, headers=headers)with open('csdn-1.html', 'w', encoding='utf-8') as f:f.write(r.content.decode())if __name__ == '__main__':run()
本文僅對Requests庫做了簡單的介紹,具體使用和更多內容請查看官網文檔,如果還有具體的使用問題可查詢更多其他資料,也歡迎在評論區留言。
參考目錄
https://requests.readthedocs.io/projects/cn/zh-cn/latest/
https://www.bilibili.com/video/BV1uz411q7Pg
https://www.bilibili.com/video/BV1pT4y1A7dV
https://blog.csdn.net/sallyyellow/article/details/129878909
https://blog.csdn.net/Ghjkku/article/details/127281184