設置需要子協議的$connect WebSocket 路由 - Amazon API Gateway

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

設置需要子協議的$connect WebSocket 路由

客戶端可以使用該Sec-WebSocket-Protocol字段在連接到您的 WebSocket API 期間請求WebSocket 子協議。您可以設定 $connect 路由整合,以允許只有在用戶端請求您的 API 支援的子通訊協定時才允許連線。

下列範例 Lambda 函數會將 Sec-WebSocket-Protocol 標題傳回用戶端。只有在用戶端指定 myprotocol 子協議時,該函數才會建立到您的 API 的連線。

如需建立此 AWS CloudFormation 範例 API 和 Lambda 代理整合的範本,請參閱ws-subprotocol.yaml

export const handler = async (event) => { if (event.headers != undefined) { const headers = toLowerCaseProperties(event.headers); if (headers['sec-websocket-protocol'] != undefined) { const subprotocolHeader = headers['sec-websocket-protocol']; const subprotocols = subprotocolHeader.split(','); if (subprotocols.indexOf('myprotocol') >= 0) { const response = { statusCode: 200, headers: { "Sec-WebSocket-Protocol" : "myprotocol" } }; return response; } } } const response = { statusCode: 400 }; return response; }; function toLowerCaseProperties(obj) { var wrapper = {}; for (var key in obj) { wrapper[key.toLowerCase()] = obj[key]; } return wrapper; }

您可以使用 wscat 來測試 API 是否允許連線,但只有在用戶端要求您的 API 支援的子通訊協定時才可以。下列命令會使用 -s 旗標來指定連線期間的子通訊協定。

下列命令會嘗試使用不受支援的子通訊協定進行連線。因為用戶端指定 chat1 子通訊協定,Lambda 整合會傳回 400 錯誤訊息,而且連線失敗。

wscat -c wss://api-id.execute-api.region.amazonaws.com/beta -s chat1 error: Unexpected server response: 400

下列命令在連線要求中包含支援的子通訊協定。Lambda 整合允許連線。

wscat -c wss://api-id.execute-api.region.amazonaws.com/beta -s chat1,myprotocol connected (press CTRL+C to quit)

若要進一步瞭解呼叫 WebSocket API,請參閱叫用 WebSocket API