管理連線使用者和用戶端應用程式:$connect 和 $disconnect 路由 - Amazon API Gateway

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

管理連線使用者和用戶端應用程式:$connect$disconnect 路由

$connect 路由

用戶端應用程式會透過傳送 WebSocket 升級要求來連線至您的 WebSocket API。如果請求成功,會在建立連線的同時執行 $connect 路由。

因為 WebSocket 連線是可設定狀態的連線,因此您只能在$connect路由上設定授權。 AuthN/AuthZ將僅在連接時間進行。

在與 $connect 路由關聯的整合執行完成後,升級請求會處於等待中,且將不會建立實際的連線。如果 $connect 請求失敗 (例如,由於 AuthN/AuthZ 故障或整合故障),將不會進行連線。

注意

如果在進行 $connect 時授權失敗,就不會建立連線,用戶端將會收到 401403 回應。

$connect 設定整合是選用的。您應在以下情況考慮設定 $connect 整合:

  • 您想要讓用戶端使用 Sec-WebSocket-Protocol 欄位來指定子通訊協定。如需範例程式碼,請參閱設置需要子協議的$connect WebSocket 路由

  • 您希望在用戶端連線時收到通知。

  • 您想要調節連線或控制連線的人員。

  • 您想要後端使用回呼 URL 將訊息傳回給用戶端。

  • 您想將每個連線 ID 和其他資訊放到資料庫 (例如,Amazon DynamoDB)。

$connect 路由傳遞連線資訊

您可以同時使用代理和非代理整合,將資訊從 $connect 路由傳遞至資料庫或其他 AWS 服務。

使用代理整合傳遞連線資訊

您可以從事件中的 Lambda 代理整合存取連線資訊。使用另一個 AWS 服務 或 AWS Lambda 函數發佈到連接。

下列 Lambda 函數顯示如何使用 requestContext 物件來記錄連線 ID、網域名稱、階段名稱和查詢字串。

Node.js
export const handler = async(event, context) => { const connectId = event["requestContext"]["connectionId"] const domainName = event["requestContext"]["domainName"] const stageName = event["requestContext"]["stage"] const qs = event['queryStringParameters'] console.log('Connection ID: ', connectId, 'Domain Name: ', domainName, 'Stage Name: ', stageName, 'Query Strings: ', qs ) return {"statusCode" : 200} };
Python
import json import logging logger = logging.getLogger() logger.setLevel("INFO") def lambda_handler(event, context): connectId = event["requestContext"]["connectionId"] domainName = event["requestContext"]["domainName"] stageName = event["requestContext"]["stage"] qs = event['queryStringParameters'] connectionInfo = { 'Connection ID': connectId, 'Domain Name': domainName, 'Stage Name': stageName, 'Query Strings': qs} logging.info(connectionInfo) return {"statusCode": 200}

使用非代理整合傳遞連線資訊

  • 您可以透過非代理整合存取連線資訊。設定整合要求並提供 WebSocket API 要求範本。下列 Velocity 範本語言 (VTL) 對應範本以提供整合要求。此要求會將下列詳細資訊傳送至非 Proxy 整合:

    • 連線 ID

    • 網域名稱

    • 階段名稱

    • 路徑

    • 標頭

    • 查詢字串

    此要求會將連線 ID、網域名稱、階段名稱、路徑、標頭和查詢字串傳送至非 Proxy 整合。

    { "connectionId": "$context.connectionId", "domain": "$context.domainName", "stage": "$context.stage", "params": "$input.params()" }

    如需設定資料轉換的詳細資訊,請參閱 設定 API 的資料轉換 WebSocket

    如要完成整合請求,請設定整合回應的 StatusCode: 200。若要深入瞭解如何設定整合回應,請參閱 使用 API Gateway 主控台設定整合回應

$disconnect 路由

$disconnect 路由會在連線關閉後執行。

連線可以由伺服器或用戶端關閉。由於連接在執行時已經關閉,$disconnect 是一個最佳努力的事件。API Gateway 會盡力將 $disconnect 事件傳遞給整合,但無法保證傳遞成功。

後端可以透過使用 @connections API 來起使化中斷連線。如需更多詳細資訊,請參閱 在後端服務使用 @connections 命令