在连接到 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
-s
标志指定子协议。
以下命令尝试使用不受支持的子协议进行连接。由于客户端指定了 chat1
子协议,因此,Lambda 集成将返回 400 错误,并且连接将失败。
wscat -c wss://
api-id
.execute-api.region
.amazonaws.com/beta
-s chat1error: Unexpected server response: 400
以下命令在连接请求中包含支持的子协议。Lambda 集成允许连接。
wscat -c wss://
api-id
.execute-api.region
.amazonaws.com/beta
-s chat1,myprotocolconnected (press CTRL+C to quit)
要了解有关调用 WebSocket API 的更多信息,请参阅调用 WebSocket API。