Skip to content
ADP
API Design PrincipleBETA

[ADP-373] 伺服器端事件

概述

伺服器端事件(SSE)是向客戶端提供即時通知的方式之一。SSE 允許伺服器通過單一的長期 HTTP 連接向客戶端推送更新。這種機制對於需要及時更新的應用程序特別有用,例如實時資訊流、通知或實時數據監控。

指導

伺服器實現

  • API 提供者(伺服器)必須(MUST)在回應標頭中指定 Content-Type: text/event-stream,以表明回應是事件流。

  • 伺服器應(SHOULD)盡可能保持連接開放,以持續向客戶端推送更新。

  • 流中的每個事件應(SHOULD)遵循 SSE 格式:

    • 數據行:以 "data:" 開頭,後跟事件數據。

    • 事件行:以 "event:" 開頭,後跟事件名稱(可選)。

    • ID 行:以 "id:" 開頭,後跟事件的唯一標識符(可選)。

    • 重試行:以 "retry:" 開頭,後跟重新連接時間(毫秒)(可選)。

  • 你可以在標頭中設計一個機制來終止連接。

客戶端實現

  • 如果 API 消費者(客戶端)請求持續的伺服器端消息而不是一次性的請求-回應,必須(MUST)在請求標頭中指定 Accept: text/event-stream

  • 客戶端應(SHOULD)優雅地處理重新連接,以應對網絡問題或伺服器重啟。

  • API 消費者(瀏覽器客戶端)應(SHOULD)使用具有流支持的 Fetch API,而不是 EventSource API,因為後者被認為已過時且靈活性較低。

  • 錯誤處理:如果在流期間發生錯誤,伺服器應(SHOULD)發送錯誤事件。客戶端可以使用此功能適當處理錯誤。

  • 終止標頭:伺服器可(MAY)包含自定義標頭 X-SSE-Terminate,值為 true,以指示應終止連接。

安全考慮

  • 確保適當的授權機制到位。伺服器應在建立 SSE 連接之前驗證客戶端的權限。

  • 必須使用安全傳輸(HTTPS)以保護數據完整性和機密性。

  • 在伺服器上實施速率限制,以防止濫用 SSE 端點。

  • 客戶端應監聽錯誤事件並適當處理,例如重試連接或向用戶顯示錯誤消息。

  • 客戶端應檢查回應中的 X-SSE-Terminate 標頭,如果存在且設置為 true,則終止連接。

示例

OpenAPI 文件示例

yaml
openapi: 3.1.0
info:
  title: Server Side Events API
  version: 1.0.0
paths:
  /events:
    get:
      summary: Subscribe to server side events
      operationId: subscribeEvents
      responses:
        '200':
          description: Stream of server side events
          content:
            text/event-stream:
              schema:
                type: string
                examples:
                  - |
                    event: message
                    data: {"message": "Hello, World!"}

                    id: 1
                    event: update
                    data: {"update": "New data available"}

參考

規範參考

設計參考