python+requests實現接口測試 - get與post請求使用

簡介:Requests 是用Python語言編寫,基於 urllib,採用 Apache2 Licensed 開源協議的 HTTP 庫。它比 urllib 更加方便,能夠節約咱們大量的工做,徹底知足 HTTP 測試需求。Requests 的哲學是以 PEP 20 的習語爲中心開發的,因此它比 urllib 更加 Pythoner。更重要的一點是它支持 Python3 哦!html

 

1、安裝python

使pip安裝:json

pip install requestsapi

安裝完後,運行一個簡單的例子查看是否安裝成功:cookie

1數據結構

2app

3post

4測試

5編碼

import requests                                 #導入requests包

r=requests.get(url='https://www.baidu.com/')   

print(r.status_code)                            #查看請求返回的狀態

#結果

200

  

 

2、幾種請求類型

  ①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")

 

3、get請求

傳遞url參數

在get請求中,容許使用params關鍵字,以一個字典來傳遞這些參數,例如:

1

2

3

4

5

6

7

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請求中的

1

2

3

4

5

6

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內容,如某些須要用戶登陸才能訪問的頁面,相關內容請輕戳這裏

 

4、post請求

1.以表單形式傳遞參數:

想要發送一些表單形式的數據,只需簡單的傳遞一個字典給data關鍵字,在發送請求的時候,會自動編碼爲表單的形式,例如:

1

2

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()

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

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

 

content=json.loads(str_content)      #把json格式的字符串解碼爲原先的數據結構

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,元組()會被映射爲列表[],如:

1

2

3

4

5

6

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": [12]}

 

所以 想要在post請求中使用data關鍵字來傳遞json格式的字符竄,首先得把dict轉爲string,例如:

1

2

3

4

5

6

7

8

9

import requests

import json

url='http://www.xxx.com/api/v1/user/login'

data={"ua":"13700002000","pw":"12qwaszx","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類型

1

2

3

4

import requests            #不須要導入json模塊

url='http://xxxx/api/v1/user/login'

data={"ua":"13700002000","pw":"12qwaszx","ct":12}

r=requests.post(url,json=data)

 

在post請求中用到的cookie部分。先關內容仍是輕戳這裏 

5、定製headers

若想要爲請求添加頭部信息,只須要在請求中使用headers關鍵字傳遞一個字典便可

首先簡單介紹下headers中的內容:

  Host:www.xxx.com                   指定請求資源的主機

  Accept:image/png,*/*,q=0.5                指定客戶端接受哪些類型的響應內容

  Accept-Language:zh-CN,zh;q=0.8,en;q=0.6     客戶端的操做系統語言,一般使用中文操做系統,屬性值通常爲zh-cn

  Accept-Encoding:gzip, deflate               客戶端所能接受的編碼規則或格式規範

  Referer:Referer':'http://xx.com/user/login.html?   能夠理解爲請求來源

  Connection:keep-alive               表示當client和server通訊時對於長連接如何處理  

  cookies                       不解釋...

  ....

 

查看請求中發出的請求頭,可使用以下方法:

1

2

3

4

5

6

import requests

r=requests.post(url,data)

print(r.request.headers)      #查看發出的請求頭

 

-----結果-----

{'User-Agent''python-requests/2.13.0''Accept-Encoding''gzip, deflate''Accept''*/*''Connection''keep-alive', <br>'Content-Length''49''Content-Type''application/json'}

  

定製headers請求以下:

1

2

3

4

5

6

import requests

headers={'Accept':'*/*'

         'Accept-Encoding':'gzip, deflate, sdch'

          ...

        }

r=requests.post(url,data,headers=headers)

  

 

6、響應

1.響應狀態

在請求發送成功後,能夠用status_code來查看相應狀態(每一個狀態表明的具體意義不在此文介紹)

1

2

3

4

5

6

import requests

r=requests.get(url)

print(r.status_code)

 

-----結果-----

200

 

2.響應內容

在上面的內容中,已經展現了用text來獲取相應的內容,返回的內容爲string

1

2

3

4

5

6

7

8

import requests

r=requests.get(url)

print (r.text)

print (type(r.text))       #查看返回內容的類型

 

-----結果-----

..........                 #返回的具體內容

<class 'str'>              #類型爲string

 

除此以外,requests中也帶有帶有一個內置的json解析器,將返回的內容轉換爲dict

1

2

3

4

5

6

7

8

import requests

r.requests.get(url)

print (r.json())

print (type(r.json()))

 

-----結果-----

......

<class 'dict'>

那麼經過json解析器轉爲dict後,想要查看到返回內容中某個具體參數的值,就比較方便啦!

 

3.響應內容編碼格式

在獲取響應內容的時候,可使用r.encoding來查看相應內容的編碼格式

1

2

3

4

5

6

import requests

r=requests.get(url)

print(r.encoding)

 

-----結果-----

UTF-8

 

也能夠進行指定編碼,當改變了編碼方式是後,每次獲取響應內容,都會使用新的編碼方式

1

2

3

4

import requests

r=requests.get(url)

r.encoding='ISO-8859-1'

print(r.text)

 

4.響應頭內容

1

2

3

import requests

r=requests.get(url)

print (r.headers)

 

5.cookies

1

2

3

import requests

r=requests.get(url)

print (r.cookies)

 

7、設置超時時間

能夠經過timeout來設置超時時間,若是在此時間內沒有響應,會報錯

1

2

import requests

r=requests.get(url,timeout=1)

 

 

 

  

 

 

 

分類: 接口測試

相關文章
相關標籤/搜索