在講今天的內容之前,我們應該先了解一些基本的基礎知識,要不然,突然講鑒權,可能有點懵,聽不太懂,所以,我會先把基礎的東西先梳理一遍
一、什么是接口測試?
接口測試:本質是基於某種協議,發送一個請求給服務器,然后服務器返回一個響應數據,然后對響應數據進行分析,判斷是否與我們預期的返回一致,從而驗證功能是否正確,這就是接口測試
二、授權和鑒權的區別?
授權:相當於給一個通行證
鑒權:鑒定是否有權訪問(判斷有沒有通行證)
三、cookie與session的區別
1、cookie是一個小的小文本文件,是由web服務器保存在用戶瀏覽器上的小文本文件,包含用戶的相關信息,無論何時用戶訪問到服務器,都會帶上該服務器的cookie信息,一般cookie是有有效期的,cookie只在瀏覽器上保存一段規定的時間,一旦超過規定的時間,該cookie就會被系統清除
2、session是將數據存儲在服務器中,服務器會為每一個用戶創建一條session,用戶訪問服務器的時候需要拿着session去表明自己的身份,session的實現是基於cookie,session需要借助於cookie來存儲sessionID,session可以自動保存cookie信息
另外注意:cookie和session都是開發設置的,我們作為測試人員,不要想着去怎么設置,基本與測試人員無關,我們只是測接口
cookie_session鑒權的接口
接下來,我們以課堂派的接口為例,為大家講解如何進行cookie和session方式鑒權的接口,提前准備好一些接口信息,比如:
# 1.登錄接口
login_url = "https://www.ketangpai.com/UserApi/login"
請求方法:post
請求參數類型:表單類型
請求參數: 有時候我們並沒有拿到開發人員給我們的接口文檔,那請求參數怎么獲取,只能去瀏覽器上手動抓包,獲取這些信息
email: 郵箱(賬號)
password: 密碼
remember: 0
# 2.獲取班級列表的接口地址
course_url = "https://www.ketangpai.com/CourseApi/lists"
直接來上代碼
""" 提前准備的工作:課堂派的接口 # 1.登錄接口 login_url = "https://www.ketangpai.com/UserApi/login" 請求方法:post 請求參數類型:表單類型 請求參數: email: 郵箱(賬號) password: 密碼 remember: 0 # 2.獲取班級列表的接口地址 course_url = "https://www.ketangpai.com/CourseApi/lists" 筆記: http請求時無狀態的: 可以通過cookie或者token來傳遞用戶登錄的狀態信息 session可以自動保存cookie信息 cookie+session進行鑒權的接口,在python的處理: requests模塊中有一個session類,使用session類的同一個對象發送請求,會自動保存之前請求的cookie信息 """ import requests # 創建一個session對象 session = requests.Session() # -------------------------請求課堂派登錄接口------------------------------------- # 接口地址 login_url = "https://www.ketangpai.com/UserApi/login" # 請求參數 params = { "email": "1234667890", "password": "000000123", "remember": 0 } response = session.post(url=login_url, data=params) print(response.json()) # -------------------請求課堂派課程列表的接口--------------------------- course_url = "https://www.ketangpai.com/CourseApi/lists" response2 = session.get(url=course_url) print(response2.json())
token鑒權的接口
我們以<前程貸>的項目中的充值功能為例,來講解如何進行token鑒權,因為是先登錄,登錄后才能實現充值功能
token鑒權解決思路:
1、登錄,獲取服務器返回的token
2、提取登錄之后返回的token
1、要么從返回的響應數據中提取
2、要么從響應頭中提取
3、請求需要鑒權的接口時,加上前面提取得token
1、要么把token放在請求頭中
2、要么返回請求的參數中
import requests from jsonpath import jsonpath# 登錄 login_url = "http://api.lemonban.com/futureloan/member/login" params = { "mobile_phone": "15879563287", "pwd": "lemonban" } headers = { "X-Lemonban-Media-Type": "lemonban.v2" } # 1、發送請求登錄 response = requests.post(url=login_url, json=params, headers=headers) # 獲取請求之后返回得數據 result = response.json() # 2、提取token token = jsonpath(result, "$..token")[0] token_data = "Bearer" + " " + token # 提取用戶id member_id = jsonpath(result, "$..id")[0] # ------------------------------充值-------------------------- recharge_url = "http://api.lemonban.com/futureloan/member/recharge" # 充值的參數 recharge_params = { "member_id": member_id, # 充值的用戶id哪里來? "amount": 10000 } # 請求頭 headers2 = { "X-Lemonban-Media-Type": "lemonban.v2", "Authorization": token_data } response2 = requests.post(url=recharge_url, json=recharge_params, headers=headers2) print("充值的結果:", response2.json())
我們先對代碼中的部分,進行語法介紹,怕有的同學看不太懂
然后再從大局角度或者宏觀角度,再來整體看看代碼是如何實現token鑒權的
所以,以上兩種就是requests請求需要鑒權的具體過程
其實,從以上兩個舉例中,我們都可以找到一些共同的影子,無論是哪種鑒權方式,都是測某個功能的接口,都需要先過登錄這一關,這是門檻,然后再利用登錄后的信息的基礎上,再去測試具體的某個功能接口,
第一種:創建seeion對象,登錄后,sesson保存cookie信息,然后用seesion請求
第二種:從登錄后返回的數據中獲取token,再把token放在該放的位置,然后照常用requests請求
token過期怎么辦?
拓展一個小內容:如果token過期了,那如何進行處理?在代碼中如何進行改進?
導入時間類,登錄前設置開始時間,后邊再設置結束時間,通過if判斷時間,token有效期是否過期,如果過期,則重新登錄,(詳情請見紅色代碼標記之處)
import requests from jsonpath import jsonpath import time # 登錄 login_url = "http://api.lemonban.com/futureloan/member/login" params = { "mobile_phone": "15879563287", "pwd": "lemonban" } headers = { "X-Lemonban-Media-Type": "lemonban.v2" } s_time = time.time() # 1、發送請求登錄 response = requests.post(url=login_url, json=params, headers=headers) # 獲取請求之后返回得數據 result = response.json() # 2、提取token token = jsonpath(result, "$..token")[0] token_data = "Bearer" + " " + token # 提取用戶id member_id = jsonpath(result, "$..id")[0] # ------------------------------充值-------------------------- recharge_url = "http://api.lemonban.com/futureloan/member/recharge" # 充值的參數 recharge_params = { "member_id": member_id, # 充值的用戶id哪里來? "amount": 10000 } # 請求頭 headers2 = { "X-Lemonban-Media-Type": "lemonban.v2", "Authorization": token_data } e_time = time.time() if e_time - s_time > 300: pass # 重新登錄提取token
response2 = requests.post(url=recharge_url, json=recharge_params, headers=headers2) print("充值的結果:", response2.json())
小編願同廣大網友一起交流,共同進步