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)