在後端服務使用 @connections 命令 - Amazon API Gateway

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

在後端服務使用 @connections 命令

您的後端服務可以使用下列 WebSocket 連線 HTTP 要求,將回呼訊息傳送至連線的用戶端、取得連線資訊或中斷用戶端的連線。

重要

這些請求使用 IAM 授權,所以您必須使用 Signature 第 4 版 (SigV4) 來進行簽署。若要執行此作業,您可以使用 API Gateway 管理 API。如需詳細資訊,請參閱ApiGatewayManagementApi

在以下命令中,您需要替換為實際{api-id}的 API ID,該 ID 顯示在 API Gateway 控制台中或由 AWS CLI create- api 命令返回。使用此命令之前,您必須先建立連線。

若要將回呼訊息傳送給用戶端,請使用:

POST https://{api-id}.execute-api.us-east-1.amazonaws.com/{stage}/@connections/{connection_id}

您可以使用 Postman 或呼叫 awscurl 來測試此請求,如下範例所示:

awscurl --service execute-api -X POST -d "hello world" https://{prefix}.execute-api.us-east-1.amazonaws.com/{stage}/@connections/{connection_id}

您需要以 URL 編碼處理命令,如以下範例所示:

awscurl --service execute-api -X POST -d "hello world" https://aabbccddee.execute-api.us-east-1.amazonaws.com/prod/%40connections/R0oXAdfD0kwCH6w%3D

若要取得用戶端的最新連線狀態,請使用下列命令:

GET https://{api-id}.execute-api.us-east-1.amazonaws.com/{stage}/@connections/{connection_id}

若要中斷用戶端連線,請使用下列命令:

DELETE https://{api-id}.execute-api.us-east-1.amazonaws.com/{stage}/@connections/{connection_id}

您可以在整合時使用 $context 變數來動態建置回呼 URL。例如,如果您使用 Lambda 代理整合搭配 Node.js Lambda 函數,您可以如下所示建置 URL,並傳送訊息到連線用戶端:

import { ApiGatewayManagementApiClient, PostToConnectionCommand, } from "@aws-sdk/client-apigatewaymanagementapi"; export const handler = async (event) => { const domain = event.requestContext.domainName; const stage = event.requestContext.stage; const connectionId = event.requestContext.connectionId; const callbackUrl = `https://${domain}/${stage}`; const client = new ApiGatewayManagementApiClient({ endpoint: callbackUrl }); const requestParams = { ConnectionId: connectionId, Data: "Hello!", }; const command = new PostToConnectionCommand(requestParams); try { await client.send(command); } catch (error) { console.log(error); } return { statusCode: 200, }; };

傳送回呼訊息時,您的 Lambda 函數必須具有呼叫 API Gateway 管理 API 的權限。如果在建立連線前或用戶端中斷連線後張貼訊息,您可能會收到含有 GoneException 的錯誤訊息。