GaiaEx AcademyGaiaEx Academy
RESTful API 設計與 WebSocket 整合
開發者程式設計10 min read

RESTful API 設計與 WebSocket 整合

構建並消費行情資料與交易 API

分享文章

REST:資源與動詞

REST 把 CRUD 對映到 HTTP:GET 用於讀取,POST 用於建立,PATCH 用於區域性更新,DELETE 用於刪除。要誠實地使用狀態碼——返回 200 卻附帶一段錯誤 JSON 會讓客戶端崩潰。

在路徑裡做版本管理(/v1/),對大列表分頁(對僅追加的流採用遊標式資料來源),併為破壞性變更設定一段棄用過渡期來做好文件說明。

REST vs WEBSOCKET 命令式 vs 流式——大多數交易所兩者都用 REST (HTTPS) 請求 → 響應 → 空閒 下單/撤單、餘額、快照 WebSocket 持久的雙工通道 成交、訂單簿增量、行情
REST 用於狀態變更;WebSocket 用於連續行情資料——別在 HTTP 限流下輪詢訂單簿。

金鑰與 HMAC

API 金鑰用於標識身份;secret 用於證明身份。對於交易類介面,要對一個規範化字串(方法 + 路徑 + 請求體 + 時間戳)做 HMAC,這樣 secret 永遠不會在網路上明文傳輸。拒絕過期的時間戳以阻斷重放攻擊——±30s 是常用的視窗。

OAuth 適合第三方應用;純交易所機器人通常仍採用 金鑰 + HMAC。限流方面:預期會收到 429,並遵守 Retry-After。

WebSocket 升級

會話以一次帶 Upgrade: websocket 的 HTTP GET 開始;伺服器返回 101 Switching Protocols。此後,相比 HTTP 輪詢反覆進行的 TLS 握手,傳輸幀的開銷要低得多。

訂閱訊息通常是 JSON:包含 method、channels,有時還有用於私有成交的鑑權簽名。

訂單簿、成交與恢復

成交流是逐筆資料;訂單簿則是 快照 + 增量,並帶有序列號。如果你漏掉了某些序列號,就要從 REST 快照重新同步,然後只應用序列號 > 快照 的增量。

心跳:傳送 ping 或預期接收伺服器的 ping;用帶抖動的退避來重連,以避免驚群效應。

ORDER BOOK RESYNC 序列號缺口意味著你本地的訂單簿在修復前都是錯的 WS 斷開 REST 快照 訂閱增量 apply only if seq > snapshot_seq seq: 10421 gap 10422–10429 snapshot @10429 delta 10430+ 在過期的訂單簿上交易,比暫停報價一秒鐘還要糟糕
斷開之後:先取快照,再應用增量——絕不要去猜缺失的檔位。

GraphQL 與 OpenAPI

GraphQL 能為儀表盤削減過度獲取(over-fetching);許多交易所在交易熱點路徑上仍然提供 REST。OpenAPI(Swagger)規範有助於程式碼生成與 QA——務必讓示例可以直接複製貼上。

一個最小化的消費者模式

在一個任務裡執行 WebSocket 迴圈,把最新價格推入一個執行緒安全的 map,並對外暴露 HTTP 以做健康檢查。記錄重連次數;當它激增時發出告警。

把簽名和時鐘偏移測試放進 CI:生產環境裡一個出錯的 HMAC,在你審計日誌之前,和「行情剛好動了」根本無法區分。