背景:在接口測試中我們經常是需要一個登陸token,或者獲取其他用到的參數來關聯下一個接口用到的參數。
Token的意義及用法
一.Token的來源:
當客戶端多次向服務端請求數據時,服務端就需要多次從數據庫中查詢用戶名和密碼並進行對比,判斷用戶名和密碼是否正確,並作出相應提示。但這樣無疑會增加服務器端的運行壓力,是否可以有一種方式只需要驗證用戶就是之前的用戶而不需要每次在客戶端請求數據時都需要查詢數據庫判斷用戶名和密碼是否正確。在這種請求下,引入了token來解決服務器端多次訪問數據庫問題。
1、什么是Token:
Token是服務端生成的一串字符串,作為客戶端進行請求時辨別客戶身份的的一個令牌。當用戶第一次登錄后,服務器生成一個Token便將此Token返回給客戶端,以后客戶端只需帶上這個Token前來請求數據即可,無需再次帶上用戶名和密碼。
2、使用Token的目的:
Token的目的是為了驗證用戶登錄情況以及減輕服務器的壓力,減少頻繁的查詢數據庫,使服務器更加健壯。
二. Token的運用流程:
1、當用戶首次登錄成功之后, 服務器端就會生成一個 token 值,這個值,會在服務器保存token值(保存在數據庫中),再將這個token值返回給客戶端;
2、客戶端拿到 token 值之后,進行保存 (保存位置由服務器端設置);
3、以后客戶端再次發送網絡請求(一般不是登錄請求)的時候,就會將這個 token 值附帶到參數中發送給服務器.;
4、服務器接收到客戶端的請求之后,會取出token值與保存在本地(數據庫)中的token值進行比較;
5、如果兩個 token 值相同, 說明用戶登錄成功過!當前用戶處於登錄狀態;
6、如果沒有這個 token 值, 沒有登錄成功;
7、如果 token 值不同: 說明原來的登錄信息已經失效,讓用戶重新登錄;
【案例實踐】
本案例中登錄接口返回的sign,作用類似於token值,即用該值關聯下一個接口。
【 整體思路】
1、先進行登錄操作,並從響應體中提取sign值;
2、將提取到的sign值傳參到下一個接口的請求頭header就可以了。
# 從登錄接口獲取到sign(暫且當作token),並將sign作為參數用於學生金幣充值接口 import requests import json import urllib3 urllib3.disable_warnings() # 登錄接口 url1 = "http://api.nnzhp.cn/api/user/login" # 學生金幣充值接口 url2 = "http://api.nnzhp.cn/api/user/gold_add" param1 = { "username": "niuhanyang", "passwd": "aA123456" } session = requests.session() response = session.post(url=url1, data=param1) response = json.loads(response.text) # 從響應體中提取sign(類似於token值,后面用於其它接口的調用) sign = response["login_info"]["sign"] # 由於此案例要求傳入cookie而非token值,所以只能打印出來,手動添加至下一個請求的header中 print(sign) header = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:68.0) Gecko/20100101 Firefox/68.0", "Cookie": "niuhanyang=754a2e97989e9ba3d5ab8dc6764f5b51" } # 假如此案例要求傳入token值,則不需要先print打印,可直接向header請求頭添加對象鍵值,如下: # header['token'] = sign param2 = { "stu_id": 123456, "gold": 10000 } res = session.post(url=url2, headers=header, data=param2) print(res.text)
運行結果:
754a2e97989e9ba3d5ab8dc6764f5b51 { "error_code": 0, "msg": "操作成功!" } Process finished with exit code 0
參考:https://www.cnblogs.com/du-hong/p/10735012.html