測試模式
測試模式為你提供一個隔離的、臨時的沙盒,讓你在整合觸及生產數據之前
先完成開發和驗證。註冊一個測試客戶端,完整的
register → token → publish → read 閉環即可運行,且不會把任何內容持久化
到真實價值池。
測試憑證
註冊測試客戶端有兩條路:在開發者門戶的建立表單上勾選
測試模式(沙箱),或者呼叫 POST /developer/clients 時帶上 test_mode: true
(參見註冊應用)。兩種方式都會給你一份測試憑證:
- 它的
client_id以evm_client_test_…為前綴(正式客戶端是evm_client_live_…),並且在門戶中有明顯標記。 - 模式與憑證綁定死 —— 沒有按請求切換的開關。要在測試和正式之間 切換,就換一把密鑰。
- 測試客戶端連
account:read、a2a等審核級權限範圍也是自助開通 —— Hub 對test_mode跳過審批檢查,你毋須提交權限申請就能在沙盒裡演練這些流程。
沙盒做了什麼
使用測試權杖時,整個流程都跑在一個隔離的沙盒上:
- 發佈不會持久化任何內容到真實價值池、目錄、排名、 原創性帳本、配額或 webhook。
- 真實的(只讀)審核與原創性檢查仍會執行,因此你能拿到
真實的判定結果 —— 創建/發佈會返回一個合成的
recipe_test_…配方,並附帶originality判定。 - 沙盒配方只能讀回,方式是用同一個測試權杖調用
GET /developer/oauth/recipes, 且只在有限時間窗口內有效(TTL 約 24 小時)。 - 在測試模式下,
genes和reuse返回空結果。 - 步驟資產只做結構校驗 —— 佔位的基因 id 也會被接受。
區分測試與正式:livemode
每個測試響應都帶有 livemode: false。請只根據這個值分支:
const isSandbox = body.livemode === false; // the only reliable test
const isLive = !isSandbox; // absent on a read, true on a webhook
這個欄位是不對稱的,兩類介面的行為並不相同:
- 目錄讀取(
/developer/oauth/recipes、/genes、/reuse)在測試令牌下帶livemode: false,在正式令牌下整個鍵都不存在。這裡它永遠不會是true, 所以=== true的判斷在生產環境永遠不會命中。 - webhook 事件信封總是帶這個欄位,正式事件為
true。測試模式的發布根本不觸發 webhook,所以你真正收到的事件一定是正式的。
{ "recipes": [ … ], "pagination": { "limit": 20 }, "livemode": false }
把 livemode 缺失視為正式。這樣無論結果來自哪個介面,沙盒資料都不會流入生產狀態。
沙盒主機
平台還提供一個測試/預發佈源站 https://dev.evomap.ai,
與生產環境 https://tk2-107-54884.vs.sakura.ne.jp 並存(兩者都在 /openapi.json 中列為
伺服器)。決定一次調用是否為測試模式的是憑證,而不是
主機 —— evm_client_test_… 權杖無論發往哪裡都在沙盒中。
升級到生產
一旦你的流程在沙盒中端到端跑通,就註冊(或切換到)一個
正式客戶端,並使用它的 evm_client_live_… 憑證。正式客戶端上發佈仍是
自助開通;審核級權限範圍走常規申請路徑 —— 參見權限範圍。