Apifox 關于token的使用方式
前言,關于token的使用,僅做了簡單的demo測驗token效果,
1.手動登錄獲取token
顧名思義,因為只有登錄之后才有token的資訊,所以在呼叫其他介面前需要擁有token才能訪問,
操作步驟
1)添加環境變數、全域引數
這里拿測驗環境舉例,在右上角環境中配置詳細資訊:測驗環境填寫變數名以及本地值
{{token}}

再在全域引數添加引數名和默認值(這樣就不用每個介面都寫一遍token了)

2)在登錄介面運行中添加后置操作
選擇提取變數,將token填入,并且根據登錄介面回傳的資料結構獲取對應的token,例如我這里就是$.data.token,

添加完畢后,執行一次獲取token介面,就會把登錄介面回傳的token資料填充到環境變數和全域引數中,

這樣請求其他介面就可以在實際引數中看到最新的token了

特別注意:后置操作不是在介面檔案中保存的,所以獲取token的后置操作要保存為用例,下次運行用例才能將token填充到環境變數中去,

2.全自動登錄實作方式
期望效果
-
運行介面用例的時候,自動完成登錄,而無需手動登錄,
-
自動登錄過一次后,保存登錄態,避免每次執行用例都呼叫登錄介面,
實作思路
-
使用 環境變數(如:token)保存登錄需要的憑證,
-
如憑證有過期時間,使用環境變數(如:
token_expires)保存登錄憑證的過期時間, -
創建一個 公共腳本 :
-
判斷環境變數token是否有值,以及token_expires是否過期,如果存在且未過期,跳出執行,否則下一步,
-
使用 pm.sendRequest 呼叫登錄介面,將登錄介面回傳的登錄憑證寫入環境變數,過期時間也寫入環境變數,
-
我這里登錄獲取token介面是沒有token_expires的,所以我去掉了相關代碼,下面最后面有完整的官方示例代碼,請參考!

這是我的腳本代碼://定義學校端查看方案串列介面請求方法,看token是否失效 function sendViewSchemeListRequest() { // 獲取環境里的 前置URL const baseUrl = pm.environment.get("BASE_URL"); const token = pm.environment.get("token"); //從環境變數獲取orgcode const orgcode = pm.environment.get("orgcode"); // 構造一個 POST body 為 json 格式請求, const viewSchemeListRequest = { url: baseUrl + "/service/schooliscqe/scheme/schemeList", method: "POST", header: { // 注意:header 需要加上 Content-Type "Content-Type": "application/json", 'token': token, 'orgCode': orgcode, }, body: { mode: 'raw',// 此處為 raw // 序列化后的 json 字串 raw: JSON.stringify( { "data": { "current": 1, "pageSize": 10 } }), }, }; // 發送請求, pm.sendRequest(viewSchemeListRequest, function (err, res) { if (err) { console.log(err); } else { const jsonData = res.json(); // 將 scheme_list_message寫入環境變數 pm.environment.set("scheme_list_message", jsonData.message); } }); } // 定義發送登錄介面請求方法 function sendLoginRequest() { // 獲取環境里的 前置URL const baseUrl = pm.environment.get("BASE_URL_LOGIN"); // 登錄用戶名,這里從環境變數 LOGIN_USERNAME 獲取,也可以寫死(但是不建議) const username = pm.environment.get("LOGIN_USERNAME"); // 登錄密碼,這里從環境變數 LOGIN_PASSWORD 獲取,也可以寫死(但是不建議) const password = pm.environment.get("LOGIN_PASSWORD"); //從環境變數獲取orgcode const orgcode = pm.environment.get("orgcode"); // 構造一個 POST body 為 json 格式請求, const loginRequest = { url: baseUrl + "/service/isptl/open/sso/login", method: "POST", header: { // 注意:header 需要加上 Content-Type "Content-Type": "application/json", 'appId': "JF-ISWCC-WEB", 'appToken': "9f3c8a5fc3710b08fc213b0955adac95eee853182b64496efe91e5d392e5e4a3614af5e43c1f945074e0ebe7ef895cae67a1368e61da8ca5c03dd98c94ee4c7c", 'timeStamp': "1680845431151", 'orgCode': orgcode, }, body: { mode: 'raw',// 此處為 raw // 序列化后的 json 字串 raw: JSON.stringify( { "data": { "loginType": "1", "accountName": username, "password": password, "mobile": "", "verifyCode": "" } }), }, }; // 發送請求, pm.sendRequest(loginRequest, function (err, res) { if (err) { console.log(err); } else { const jsonData = res.json(); // 將 token 寫入環境變數 token pm.environment.set("token", jsonData.data.token); } }); } //請求學校端查看方案串列介面 sendViewSchemeListRequest() // 獲取環境變數里的 token const token = pm.environment.get("token"); // 獲取環境變數里的 message const message = pm.environment.get("message"); // 如 token 沒有值或者message資訊不正確,則執行發送登錄介面請求 if ( !token || message === "用戶未登陸,請登錄后重試" || message === "登錄資訊已過期,請重新登錄" ) { sendLoginRequest(); }
-
-
設定需要登錄態的介面用例:
-
將用來驗證登錄態的引數值設定為
{{token}}, -
此處在環境里的全域引數統一設定,所有介面運行時會自動加上全域引數,無需每個介面手動設定,
-
在 根目錄前置操作里參考前面創建的公共腳本,保存后就可以了,
-

公共腳本示例
注意
- 示例腳本里的登錄
用戶名和密碼,是從環境變變數LOGIN_USERNAME和LOGIN_PASSWORD獲取,如果你直接拷貝代碼的話,記得要手動設定這兩個環境變數, - 如果你們的 token 沒有過期時間,可以將 token_expires相關的代碼去除,
// 定義發送登錄介面請求方法 function sendLoginRequest() { // 獲取環境里的 前置URL const baseUrl = pm.environment.get("BASE_URL"); // 登錄用戶名,這里從環境變數 LOGIN_USERNAME 獲取,也可以寫死(但是不建議) const username = pm.environment.get("LOGIN_USERNAME"); // 登錄密碼,這里從環境變數 LOGIN_PASSWORD 獲取,也可以寫死(但是不建議) const password = pm.environment.get("LOGIN_PASSWORD"); // 構造一個 POST x-www-form-urlencoded 格式請求,這里需要改成你們實際登錄介面的請求引數, const loginRequest = { url: baseUrl + "/api/v1/login", method: "POST", // body 為 x-www-form-urlencoded 格式 body: { mode: "urlencoded", // 此處為 urlencoded // 此處為 urlencoded urlencoded: [ { key: "account", value: "apifox" }, { key: "password", value: "123456" }, ], }, /* // body 為 form-data 格式 body: { mode: 'formdata', // 此處為 formdata // 此處為 formdata formdata: [ { key: 'account', value: 'apifox' }, { key: 'password', value: '123456' } ] } // body 為 json 格式 header: { "Content-Type": "application/json", // 注意:header 需要加上 Content-Type }, body: { mode: 'raw',// 此處為 raw raw: JSON.stringify({ account: 'apifox', password:'123456' }), // 序列化后的 json 字串 } // body 為 raw 或 json 格式 body: { mode: 'raw', raw: '此處為 body 內容', } */ }; // 發送請求, // pm.sendrequest 參考檔案: https://www.apifox.cn/help/app/scripts/api-references/pm-reference/#pm-sendrequest pm.sendRequest(loginRequest, function(err, res) { if (err) { console.log(err); } else { // 讀取介面回傳的 json 資料, // 如果你的 token 資訊是存放在 cookie 的,可以使用 res.cookies.get('token') 方式獲取, // cookies 參考檔案:https://www.apifox.cn/help/app/scripts/api-references/pm-reference/#pm-cookies const jsonData =https://www.cnblogs.com/wangjunjiehome/archive/2023/04/15/ res.json(); // 將 accessToken 寫入環境變數 ACCESS_TOKEN pm.environment.set("ACCESS_TOKEN", jsonData.data.accessToken); // 將 accessTokenExpires 過期時間寫入環境變數 ACCESS_TOKEN_EXPIRES pm.environment.set( "ACCESS_TOKEN_EXPIRES", jsonData.data.accessTokenExpires ); } }); } // 獲取環境變數里的 ACCESS_TOKEN const accessToken = pm.environment.get("ACCESS_TOKEN"); // 獲取環境變數里的 ACCESS_TOKEN_EXPIRES const accessTokenExpires = pm.environment.get("ACCESS_TOKEN_EXPIRES"); // 如 ACCESS_TOKEN 沒有值,或 ACCESS_TOKEN_EXPIRES 已過期,則執行發送登錄介面請求 if ( !accessToken || (accessTokenExpires && new Date(accessTokenExpires) <= new Date()) ) { sendLoginRequest(); }
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/550206.html
標籤:其他
