1. 程式人生 > 實用技巧 >介面測試之Python Requests基本功能使用

介面測試之Python Requests基本功能使用

一、Requests簡介

進行介面測試需要傳送HTTP請求,Python最基礎的 HTTP 庫有 Urllib、Httplib2、Requests、Treq 等,這裡我們推薦使用Requests庫來進行介面測試。

Requests 基於 urllib,採用 Apache2 Licensed 開源協議的 HTTP 庫。它比 urllib 更加方便,可以節約我們大量的工作,完全滿足 HTTP 測試需求。目前很多Python爬蟲也使用Requests

Requests中文文件

Requests github專案主頁

1.1、功能特性

  • Keep-Alive & 連線池
  • 國際化域名和 URL
  • 帶持久 Cookie 的會話
  • 瀏覽器式的 SSL 認證
  • 自動內容解碼
  • 基本/摘要式的身份認證
  • 優雅的 key/value Cookie
  • 自動解壓
  • Unicode 響應體
  • HTTP(S) 代理支援
  • 檔案分塊上傳
  • 流下載
  • 連線超時
  • 分塊請求
  • 支援 .netrc(使用者配置指令碼檔案)

1.2、Requests安裝

使用pip安裝命令如下,-i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com 是使用映象加速下載用的:

pip install requests -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com

二、Requests 基礎應用

2.1、傳送不同型別HTTP請求

import requests

base_url='http://httpbin.org'

#傳送GET型別的請求
r=requests.get(base_url+'/get')
print(r.status_code)

#傳送Post型別請求
r=requests.post(base_url+'/post')
print(r.status_code)

#傳送PUT型別請求
r=requests.put(base_url+'/put')
print(r.status_code)

#傳送Delete型別請求
r=requests.delete(base_url+'
/delete') print(r.status_code)

執行結果,200為請求返回的狀態碼,表示請求成功:

2.2、傳遞URL引數

一般在GET請求中我們使用查詢字串(query string)來進行引數傳遞,在requests庫中使用方法如下:

import requests

base_url='http://httpbin.org'

param_data={'key1': 'value1', 'key2': 'value2'}
r=requests.get(base_url+'/get',params=param_data)
print(r.text)

執行結果如下:

2.3、請求頭定製

如果你想為請求新增 HTTP 頭部,只要簡單地傳遞一個dictheaders引數就可以了。

import requests

base_url='http://httpbin.org'

param_data={'key1': 'value1', 'key2': 'value2'}
header={'User-Agent':"Mozilla/5.0"}
r=requests.get(base_url+'/get',params=param_data, headers=header)
print(r.text)

執行結果如下:

注意:很多爬蟲程式都會定製headers來避免被封。

2.4、響應內容

當請求傳送成功之後,我們可以獲取響應內容。如響應狀態碼,響應頭資訊、cookies資訊、響應體內容。

import requests

base_url='http://httpbin.org'

data={'key1': 'value1', 'key2': 'value2'}
header={'User-Agent':"Mozilla/5.0"}
r=requests.post(base_url+'/post',data=data, headers=header)
#獲取響應狀態碼
print(r.status_code)
#獲取響應頭資訊
print(r.headers)
#將響應的cookies
print(r.cookies)
#獲取響應內容
print(r.text)
#將響應的內容以Json格式返回
print(r.json())

2.5、Post請求中傳送資料

1、在Post請求中傳送一些編碼為表單形式的資料,要實現這個,只需簡單地傳遞一個字典給data引數。你的資料字典在發出請求時會自動編碼為表單形式,在Requests中用法如下:

import requests

base_url='http://httpbin.org'

data={'key1': 'value1', 'key2': 'value2'}
r=requests.post(base_url+'/post',data=data)
print(r.text)

返回結果如下:

2、還可以為data引數傳入一個元組列表。在表單中多個元素使用同一 key 的時候,

import requests

base_url='http://httpbin.org'

payload = (('key1', 'value1'), ('key1', 'value2'))
r=requests.post(base_url+'/post',data=payload)
print(r.text)

執行結果:

3、傳遞json資料:

import requests
import json

base_url='http://httpbin.org'

payload = {'some': 'data'}
r=requests.post(base_url+'/post',data=json.dumps(payload))
print(r.text)

運算結果:

三、Request的進階

3.1、上傳檔案

Requests 使得上傳多部分編碼檔案變得很簡單

import requests

base_url='http://httpbin.org'
files = {'file': open('report.xls', 'rb')}
r=requests.post(base_url+'/post',files=files)
print(r.text)

執行結果

可以顯式地設定檔名,檔案型別和請求頭:

import requests

base_url='http://httpbin.org'
files = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})}
r=requests.post(base_url+'/post',files=files)
print(r.text)

執行結果:

3.2、超時

你可以告訴 requests 在經過以timeout引數設定的秒數時間之後停止等待響應。基本上所有的生產程式碼都應該使用這一引數。如果不使用,你的程式可能會永遠失去響應:

import requests

base_url='http://httpbin.org'

r=requests.get(base_url+'/get',timeout=0.01)
print(r.text)

3.3、Cookie設定

cookie設定

import requests

base_url='http://httpbin.org'

cookie={'test':'test1234'}
r=requests.get(base_url+'/cookies',cookies=cookie)
print(r.text)

cookie獲取

import requests

r=requests.get('http://www.baidu.com')
print(type(r.cookies))  
print(r.cookies)
for key,value in r.cookies.items():
    print(key+':'+value)

執行結果:呼叫了 cookies 屬性即可成功得到了 Cookies,可以發現它是一個RequestCookieJar型別,然後我們用items()方法將其轉化為元組組成的列表,遍歷輸出每一個 Cookie 的名和值,實現 Cookies 的遍歷解析。

3.4、保持會話物件

在介面測試過程中介面之間經常有依賴關係,比如下面這兩個請求一個是設定Cookie,另外一個是獲取cookie,在沒有Session儲存機制的情況下,第二個介面無法獲取第一個介面設定的Cookie值。

Request的會話物件讓你能夠跨請求保持某些引數。它也會在同一個 Session 例項發出的所有請求之間保持 cookie。具體使用如下:

import requests

base_url='http://httpbin.org'

#生成會話物件
s=requests.Session()
#設定Cookie
r=s.get(base_url+'/cookies/set/user/test')
print(r.text)
#獲取Cookie
r=s.get(base_url+'/cookies')
print(r.text)

執行發現,兩個請求的cookies是一樣的。

3.5、SSL證書驗證

Requests 可以為 HTTPS 請求驗證 SSL 證書,就像 web 瀏覽器一樣。SSL 驗證預設是開啟的,如果證書驗證失敗,Requests 會丟擲SSLError:
如果不想驗證SSL則可以使用verify引數關閉驗證SSL。

import requests

# r=requests.get('https://www.12306.cn')
#關閉驗證SSL
r=requests.get('https://www.12306.cn',verify=False)
print(r.text)

3.6、同域名,不同環境請求配置

當我們在實際過程中,可能會碰到域名相同,但是是部署在不同的伺服器上,這個時候可以通過如下配置請求:

import requests

#設定請求地址
test_url = "https://127.0.0.1:8000"
pro_url =  "https://192.168.48.63"
#設定請求頭域名
headers = {"Host":"test.ops.com"}

r=requests.get(test_url+'/getPage.json',verify=False,headers=headers)

print(r.text)