Python 介面自動化 -- requests框架
1.前言
Python內建的urllib模組,也可以用於訪問網路資源。但是,它用起來比較麻煩,而且,缺少很多實用的高階功能。因此我們使用 requests 模組進行進行介面測試。
requests官方文件資料地址:http://cn.python-requests.org/zh_CN/latest/
2.環境安裝
cmd(win+R快捷鍵)輸入:
pip install requests -i https://pypi.douban.com/simple
提示以下資訊表示安裝成功。
3.requests傳送請求
3.1 get請求無引數param
-
將安裝好的requests模組匯入後,通過GET訪問一個URL地址的網頁頁面,如:
-
這裡的 r 也就是 response,請求後的返回值,可以呼叫 response 裡的 status_code 方法檢視狀態碼
-
狀態碼 200 只能說明介面請求傳送成功了,並不能說明功能一定是 OK 的,一般要檢視響應的內容,r.text 是返回文字資訊
# -*- coding:utf-8 -*-
# 匯入 requests 模組
import requests
# 定義 url
url = 'http://www.cnblogs.com/wwho'
# 請求部落格園
r = requests.get(url=url)
# 列印狀態碼
print(r.status_code)
# 列印文字
print(r.text)
3.2 get請求有引數param
url地址為:http://apis.juhe.cn/simpleWeather/query?city=深圳&key=xxx
引數:city=深圳&key=xxx
可以以字典的形式傳參:{"city": "深圳", "key": "xxx"}
多個引數格式:
{"key1": "value1", "key2": "value2", "key3": "value3"}
(r.url獲取當前url地址,可以檢查是否傳參成功)
程式碼:
# -*- coding:utf-8 -*-
# 匯入 requests 模組
import requests
# 定義 url
url = 'http://apis.juhe.cn/simpleWeather/query'
par = {"city": "深圳",
"key": "4611a7abae4afe573fd7ca751d9d423a"}
result = requests.get(url=url, params=par)
# 列印文字
print(result.text)
3.3定製請求頭
一個完整的get請求,應該包括請求行(url) 和請求頭(headers)、請求引數(params),
什麼時候要加請求頭呢,如果你不確定的話最好加上去。
3.4 response返回資訊
response返回資訊
-- r.status_code # 響應狀態碼
-- r.content # 位元組方式的響應體,會自動為你解碼 gzip 和deflate 壓縮
-- r.headers # 以字典物件儲存伺服器響應頭,但是這個字典比較特殊,字典鍵不區分大小寫,若鍵不存在則返回 None
-- r.json() # Requests 中內建的 JSON 解碼器,requests的方便之處還在於,對於特定型別的響應,例如JSON,可以直接獲取
-- r.url # 獲取 url
-- r.encoding # 編碼格式,requests自動檢測編碼
-- r.cookies # 獲取 cookie
-- r.raw # 返回原始響應體-- r.text #字串方式的響應體,會自動根據響應頭部的字元編碼進行解碼
-- r.raise_for_status() # 失敗請求(非 200 響應)丟擲異常
以上就是requests模組主要的返回格式。
3.5 post請求
講post請求之前 先講一下 requests.session()
requests.session() 獲取 requests的session物件,簡單來說就相當於一個微型瀏覽器,能自動保持登入態。所以一般對於 cookie – session 保持登入態的系統就可以使用
requests.session()
使用方法:後續的請求都使用session即可
Post請求首先要注意的就是body的資料型別
常見的有四種類型,但是不止四種:
-
第一種:application/json: {“key1“:”value1”,“keyt2":“value2"}
-
第二種:application/x-www-form-urlencoded:name1= value1&name2=value2
-
第三種:multipart/form-data:這一種是表單格式的
(檔案上傳,圖片上傳等混合式) -
第四種:text/xml
examples.getStateName
Body為x-www-form-urlencoded型別
怎麼知道body是什麼型別?
- 介面文件有說明
- 自己抓包看
直接通過抓包就可以看出post請求的資料型別,如下圖就是x-www-form-urlencoded型別
傳data引數就行(無需轉json)
程式碼:
# -*- coding:utf-8 -*-
# @File:sms.py
import requests
host = 'http://127.0.0.1:8002'
session = requests.session() # 相當於微型瀏覽器,保持登入態
url = host + '/api/mgr/signin' # 定義url
body = {
"username": "byhy",
"password": "88888888"
}
resp = session.post(url=url, data=body)
status_code=resp.status_code #獲取響應狀態碼
print('響應狀態碼:{}'.format(status_code))
text=resp.text # 獲取響應內容,結果型別是字串
print('響應內容:{}'.format(text))
json=resp.json() # 獲取響應內容,結果是字典型別
print('響應內容:{}'.format(json))
resp_headers=resp.headers # 獲取響應headers
print('響應header:{}'.format(resp_headers))
Body為json型別
json=body: 這個表示自動將python裡面的字典,轉化為json格式引數了。關於字典和json的種種關係,後面專門寫篇文章講一下。
程式碼:
# -*- coding:utf-8 -*-
import requests
host = 'http://127.0.0.1:8002'
session = requests.session() # 相當於微型瀏覽器,保持登入態
url = host + '/api/mgr/signin' # 定義登入的 url
body = {
"username": "byhy",
"password": "88888888"
}
resp = session.post(url=url, data=body) # 傳送登入請求
url_add_customer = host + '/api/mgr/customers' # 新建客戶的 url
body = {
"action":"add_customer",
"data":{
"name":"tester",
"phonenumber":"13345679934",
"address":"深圳市南山區"
}
}
resp = session.post(url=url_add_customer, json=body)
print(resp.text) # 列印響應文字
3.6 put請求
put 請求的介面做法跟 post請求的差不多的,只是把post 請求改為 put請求。一樣要看請求的格式。如果是 json 格式,也是用json接,Form格式用data接。
程式碼:
# -*- coding:utf-8 -*-
# @Time:2021/4/16 9:54
# @File:sms.py
import requests
host = 'http://127.0.0.1:8002'
session = requests.session() # 相當於微型瀏覽器,保持登入態
url = host + '/api/mgr/signin' # 定義登入的 url
body = {
"username": "byhy",
"password": "88888888"
}
resp = session.post(url=url, data=body)
url_modify_customer = host + '/api/mgr/customers' # 修改客戶的 url
body = {
"action":"modify_customer",
"id": 52,
"newdata":{
"name":"深圳市橋北醫院",
"phonenumber":"13345678888",
"address":"深圳市中醫院"
}
}
resp = session.put(url=url_modify_customer, json=body)
print(resp.text) # 列印修改客戶介面響應的文字
3.7 delete請求
delete 請求的介面做法跟 post請求的差不多的,只是把post 請求改為 delete請求。一樣要看請求的格式。如果是 json 格式,也是用json接,Form格式用data接。
程式碼:
# -*- coding:utf-8 -*-
# @Time:2021/4/16 9:54
# @File:sms.py
import requests
host = 'http://127.0.0.1:8002'
session = requests.session() # 相當於微型瀏覽器,保持登入態
url = host + '/api/mgr/signin' # 定義登入的 url
body = {
"username": "byhy",
"password": "88888888"
}
resp = session.post(url=url, data=body)
url_delete_customer = host + '/api/mgr/customers' # 刪除客戶的 url
body = {
"action":"del_customer",
"id": 52
}
resp = session.delete(url=url_delete_customer, json=body)
print(resp.text) # 列印刪除客戶介面響應的文字
總結:
requests庫的請求方法裡引數眾多,所以簡單總結一下:
-
get請求帶引數就用params=params
-
post請求是form格式就用data=data
-
post請求是json型別引數就用json=json
-
請求頭資訊header就用headers=headers