requests做介面測試
- 2019 年 10 月 6 日
- 筆記
Requests 是用Python語言編寫,基於 urllib,採用 Apache2 Licensed 開源協議的 HTTP 庫。它比 urllib 更加方便,可以節約我們大量的工作,完全滿足 HTTP 測試需求。Requests 的哲學是以 PEP 20 的習語為中心開發的,所以它比 urllib 更加 Pythoner。
一、安裝
使pip安裝:
pip install requests

安裝完後,運行一個簡單的例子查看是否安裝成功:
import requests #導入requests包 r=requests.get(url=『https://www.baidu.com/『) print(r.status_code) #查看請求返回的狀態 #結果 200
二、幾種請求類型
①get請求:requests.get(『url『)
②post請求:requests.post("url/post")
③put請求:requests.put("url/put")
④delete請求:requests.delete("url/delete")
⑤head請求:requests.head("url/get")
⑥options請求:requests.options("url/get")
三、get請求
傳遞url參數
在get請求中,允許使用params關鍵字,以一個字典來傳遞這些參數,例如:
content={『pageIndex『:1,『pageSize『:10,『categoryId『:9} r=requests.get(『http://www.xxxxx.com/api/v2/activities『,params=content) print (r.url) #獲取請求內容 print (r.text) #獲取響應內容 #結果 http://www.xxxx.com/api/v2/activities?pageIndex=1&pageSize=10&categoryId=9 {"data":[],"pageIndex":1,"totalNum":0,"hasMore":false,"pageSize":0}
如果字典中存在None的值,是不會添加到url請求中的
content={『pageIndex『:1,『pageSize『:10,『categoryId『:None} r=requests.get(『http://www.xxxxx.com/api/v2/activities『,params=content) print (r.url) #結果 http://www.xxxx.com/api/v2/activities?pageIndex=1&pageSize=10
ps:不使用params的話,也可在請求中輸入全部的地址,效果相同,如:
r=requests.get(『http://m.xxxxx.com/api/v2/activities?pageIndex=1&pageSize=10&categoryId=9『)
注意:在某些get請求中,需要辨別用戶身份,因此會需要在請求中發送cookie內容,如某些需要用戶登錄才能訪問的頁面,在接下來的文章中會進行講解
四、post請求
1.以表單形式傳遞參數:
想要發送一些表單形式的數據,只需簡單的傳遞一個字典給data關鍵字,在發送請求的時候,會自動編碼為表單的形式,例如:
content={『key1『:『value1『,『key2『:『value2『} r=requests.post(『http://www.xxx/api/v1/user/login『,data=content)
2.以json形式傳遞參數:
在很多情況下,想要發送的數據並非為表單形式,而是一個json格式的字元串,如果傳遞給data關鍵字的內容不是一個dict,而是
一個string,那麼在發送的時候,數據會被直接發送出去,不會自動編碼為表單形式。
為了將一個數據結構轉換為json格式的字元串,首先得需要導入一個json包,兩種常用的方法為:json.dumps()與json.loads()
import json content={『name『:『Nee『,『age『:『18『} str_content=json.dumps(content) #把dick編碼為json格式的字元串 print (str_content) print (type(str_content)) #結果: {"name": "Nee", "age": "18"} <class 『str『> #此時的類型為str #把json格式的字元串解碼為原先的數據結構 content=json.loads(str_content) print (content) print (type(content)) #結果 {『name『: 『Nee『, 『age『: 『18『} <class 『dict『>
注意:1.json編碼支援的基本類型有:None, bool, int, float, string, list, tuple, dict。對於字典,json會假設key是字元串(字典中的任何非字元串key都會在編 碼時轉換為字元串),要符合JSON規範,應該只對python列表和字典進行編碼。此外,在WEB應用中,把最頂層對象定義為字典是一種標準做法。 2.json編碼的格式幾乎和python語法一致,略有不同的是:True會被映射為true,False會被映射為false,None會被映射為null,元組()會被映射為列表[],如:
content={『a『:None,『b『:True,『c『:False,『d『:(1,2)} str_content=json.dumps(content) print (str_content) #結果: {"a": null, "b": true, "c": false, "d": [1, 2]}
想要在post請求中使用data關鍵字來傳遞json格式的字元竄,首先得把dict轉為string,例如:
import requests import json url=『http://www.xxx.com/api/v1/user/login『 data={"un":"xxxxx","pw":"xxxxxx","ct":12} r=requests.post(url,data=json.dumps(data)) #在一些post請求中,還需要用到headers部分,此處未加,在下文中會說到 print (r.text) #結果 {"newUser":false,"user":{"userId":531,"mobileNo":"13700002000","userName":"測試用戶2000".......}
除了可以對dick編碼後以string的方式傳遞參數外,還可以直接使用json關鍵字直接傳遞,在傳遞時會自行進行編碼為string類型
import requests #不需要導入json模組 url=『http://xxxx/api/v1/user/login『 data={"un":"xxxxxxx","pw":"xxxxx","ct":12} r=requests.post(url,json=data)
在post請求中用到的head部分和cookie部分。在之後的文章中會進行講解
五、響應
1.響應狀態
在請求發送成功後,可以用status_code來查看相應狀態
import requests r=requests.get(url) print(r.status_code) -----結果----- 200
下面是常見的HTTP狀態碼:
200 – 請求成功
301 – 資源(網頁等)被永久轉移到其它URL
404 – 請求的資源(網頁等)不存在
500 – 內部伺服器錯誤
HTTP狀態碼由三個十進位數字組成,第一個十進位數字定義了狀態碼的類型,後兩個數字沒有分類的作用。HTTP狀態碼共分為5種類型:
分類 |
分類描述 |
---|---|
1** |
資訊,伺服器收到請求,需要請求者繼續執行操作 |
2** |
成功,操作被成功接收並處理 |
3** |
重定向,需要進一步的操作以完成請求 |
4** |
客戶端錯誤,請求包含語法錯誤或無法完成請求 |
5** |
伺服器錯誤,伺服器在處理請求的過程中發生了錯誤 |
2.響應內容
在上面的內容中,已經展示了用text來獲取相應的內容,返回的內容為string
import requests r=requests.get(url) print (r.text) print (type(r.text)) #查看返回內容的類型 -----結果----- .......... #返回的具體內容 <class 『str『> #類型為string
除此之外,requests中也帶有帶有一個內置的json解碼器,將返回的內容轉換為dict
import requests r.requests.get(url) print (r.json()) print (type(r.json())) -----結果----- ...... <class 『dict『>
那麼通過json解碼器轉為dict後,想要查看到返回內容中某個具體參數的值,就比較方便啦!
3.響應內容編碼格式
在獲取響應內容的時候,可以使用r.encoding來查看相應內容的編碼格式
import requests r=requests.get(url) print(r.encoding) -----結果----- UTF-8
也可以進行指定編碼,當改變了編碼方式是後,每次獲取響應內容,都會使用新的編碼方式(建議在所有情況下都使用utf-8,如果你對編碼一點都不了解,那使用utf-8就對了!)
import requests r=requests.get(url) r.encoding=『ISO-8859-1『 print(r.text)
4.響應頭內容
import requests r=requests.get(url) print (r.headers)
5.cookies
import requests r=requests.get(url) print (r.cookies)