在開發過程中,為了更好地處理傳遞給接口的參數值,解決在調試過程中的數據處理問題,我們經常需要用到函數處理數據。
過去,我們通過預執行腳本來處理數據,先添加腳本,然後將處理後的結果再賦值給請求參數。
這種方法有一些不足:
- 無法立即看到處理結果,必須分步驟進行,可能導致錯誤或不一致性,增加調試的難度;
- 預執行腳本需要在接口或項目更新時進行相應維護,增加了維護的工作量。
一、Apipost自定義函數解決方案:
我們可以直接在Apipost請求參數的位置添加處理函數,並且可以實時預覽函數處理後的結果。這一改變使得整個使用流程更加高效和用户友好。
優勢:
- 可以直接在請求參數位置添加處理函數,操作更加直觀和簡單。
- 能夠即時看到處理函數的結果,幫助快速確認數據的正確性,減少調試時間。
- 如果需要修改處理邏輯,只需在函數內部進行調整,無需重新編寫和執行整個腳本,降低了錯誤發生的可能性。
- 可以根據需要快速切換不同的處理方法,不再受限於固定的腳本邏輯,提升了靈活性和應對變化的能力。
- 團隊協作共同維護一套處理函數庫,提升團隊協作效率
我們可以利用Apipost的自定義函數對接口傳遞參數值進行處理:如:數據驗證、數據清理、編碼處理、加密和簽名、參數格式化、默認值處理等。
Apipost目前內置了以下處理函數:md5、lower、length、substr、sha、base64、unbase64、encodeURlComponent、decodeURlComponent、concat、lconcat;如果內置的函數不能滿足需求,也可以靈活擴充函數庫,滿足更多場景的需求。比如:時間戳轉換為日期,或者去除參數中的空格等。
關於Apipost自定義函數功能的介紹,我們可以通過以下視頻來了解。
此處添加視頻號視頻。
二、四大場景實戰
場景一:動態構造接口簽名
需求:構造含時間戳、隨機數、MD5簽名的鑑權參數
第一步: 在Query參數填寫參數名並進入參數值編輯欄
第二步: 值輸入框選擇"引用變量" → 選擇$timestamp獲取10位時間戳
第三步:添加函數處理 → 選擇concat輸入000,使時間戳精確到13位毫秒
第四步: 繼續添加md5加密 → 自動生成
第五步:點擊插入,生成表達式{{$telephone|concat(000)|md5}}
效果預覽:
?timestamp=e382279f1e69844a19f4ada2b16122db
場景二:中文轉義參數自動化
需求:測試包含中文字符的接口進行長度限制和轉義
第一步:在Body參數值輸入框選擇"Mock數據" → 選擇$mockjs.cparagraph()生成一段中文文本
第二步: 添加函數處理 → 選擇substr輸入0-5,使中文字符限制在5位
第三步: 添加encodeURIComponent轉碼
第四步: 點擊插入,生成表達式{{$mockjs.cparagraph()|substr(0,5)|encodeURIComponent}}
效果預覽:
content=%E5%8A%9E%E5%B9%B3%E8%BF%9B%E6%89%93%E5%8D%8A
場景三:金融級數據安全測試
需求:測試銀行卡號加密接口
第一步: 選擇"固定值" → 填寫6225880137700891
第二步: 繼續添加sha256加密
第三步: 最後用base64二次編碼
加密流水線:
原始卡號 → sha256摘要 → base64字符串
第四步: 點擊插入,生成表達式{{'6225880137700891'|sha256|base64}}
效果預覽:
key=NWFjMjBkNjc2YjMzYzc0MDJkZTRkZjlkMDUzMjg0NWNiZmJmZTJkMmQ2YTI4ZmNmZGI4NTg5YWIzZTFlNGEzZA==
場景四:電商庫存測試
需求:模擬100種SKU參數
第一步: 生成Path參數 /goods/{guid}
第二步: 選擇"Mock數據" → 選擇$mockjs.guid()隨機生成一個GUID
第三步: 添加lower函數統一小寫
第四步: 組合padEnd確保長度32位
第五步: 點擊插入,生成表達式{{$mockjs.guid()|lower|padEnd(32)}}
第六步: 自動化測試運行時自動生成:
/goods/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
三、項目級自定義函數
在Apipost"項目設置-自定義函數"中,我們可以三步構建可複用的函數庫:
第一步:創建新的處理函數
-
點擊"新建",命名需遵守法則:
- 只允許
字母/數字/下劃線(如timestamp_converter) - 函數名唯一,在創建後不支持修改函數名。
- 只允許
-
植入函數代碼(測試流程):
// 創建 Date 對象 const date = new Date(text); // 檢查日期是否有效 if (isNaN(date.getTime())) { return '無效的日期格式'; } // 獲取時間戳(毫秒) const timestamp = date.getTime(); return timestamp; - 點擊"測試"按鈕,輸入
2024-12-12驗證輸出1733961600000
第二步:管理現有函數
- 批量部署:為不同業務線創建
支付_簽名生成、物流_單號校驗等函數 - 操作警示:刪除函數將導致歷史用例集體癱瘓
第三步:使用自定義函數
創建自定義函數後,我們在插入動態值時,即可使用。
四、使用技巧
當我們在自定義函數中處理數字時,系統傳入的始終是字符串類型。想進行數值運算,需要先完成“類型轉化”:
// 正確姿勢
let numTimestamp = Number(text);
const date = new Date(numTimestamp);
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
const hours = String(date.getHours()).padStart(2, '0');
const minutes = String(date.getMinutes()).padStart(2, '0');
const seconds = String(date.getSeconds()).padStart(2, '0');
return text = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
// 錯誤示範(將導致NaN)
const date = new Date(text);
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
const hours = String(date.getHours()).padStart(2, '0');
const minutes = String(date.getMinutes()).padStart(2, '0');
const seconds = String(date.getSeconds()).padStart(2, '0');
return text = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
五、總結
Apipost通過三層架構重構參數處理,幫我們實現了參數處理從"體力勞動"到"智能編排"的革命。
- 數據層:內置200+Mock規則庫
- 處理層:17種函數組成的處理流水線
- 擴展層:JavaScript自定義函數的無限可能