设置需要 WebSocket 子协议的 $connect 路由 - Amazon API Gateway

设置需要 WebSocket 子协议的 $connect 路由

在连接到 WebSocket API 期间,客户端可以使用 Sec-WebSocket-Protocol 字段请求 WebSocket 子协议。您可以为 $connect 路由设置集成,以便仅当客户端请求您的 API 支持的子协议时允许连接。

以下示例 Lambda 函数将 Sec-WebSocket-Protocol 标头返回给客户端。仅当客户端指定 myprotocol 子协议时,此函数才会建立与 API 的连接。

如需创建此示例 API 和 Lambda 代理集成的 AWS CloudFormation 模板,请参阅 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