ここで説明されているように、$ CONNECT ROUTEにカスタム承認者を持つAWS API Gateway WebSocketを設定しています。
私の質問は、ConnectionID、つまり識別子が後で接続されているクライアントにブロードキャストするために使用できる方法をどうやっていますか?
質問では、どのタイプのバックエンドが使用されているかを指定しません。 AWS API GatewayのAWSドキュメントは、Lambda関数に向かって対応しています。
ビッグエンディアンによる答えを試みる、私はいくつかの問題を見つけました - 私のCakePHPバックエンドは引用済みJSONボディを復号しません。私は解決策を見つけました、しかし、彼の答えを実施するために必要な他の多くのステップがありましたので、ここでは:
HTTPプロキシを使用してルートキーを作成し、次のようにリクエストテンプレートを設定します(非常にスパースドキュメントも)。
ルートキー:購読する
[。]これは{"action"というすべての要求を意味します。 "subscribe"}はここでルートします
統合要求の種類:http.
そして、ハードパートの場合:リクエストテンプレートを設定します。このテンプレートを使用するようなすべての「購読」要求を求めて、これを行うことができる唯一の方法は、Template Selection式をRoute Selection式:$ Request.Body.actionと同じに設定し、「購読する」 "。
これは、APIがこのテンプレートを適用するためにしなければならないのと同じコンテンツのための二重テストになることが終わっています - そして誰かがこれをより良い方法を持っているなら、コメントしてください。
そして最後のステップは、 'subscribe'の "Generate Template"としてこれを入力することです。
{"connectionId": "$context.connectionId", "body": $input.body}
_
私の場合、私の体はJSONで、$ input.bodyは引用符で囲まれていませんでした - Body JSONはテンプレートによって拡張されます。ボディがただの文字列である場合は、テンプレートは
{"connectionId": "$context.connectionId", "body": "$input.body"}
_
しかし、ルーティングがJSONのアクションキーを含むボディを必要とするため、ルーティングはここに入りません。
統合要求にコンテンツを追加するには、リクエストテンプレートを使用する必要があります。
\$default
と入力してください。スラッシュに注意してください。フルドキュメント ここ 。)$default
と入力してください。スラッシュがないことに注意してください。){
"myConnectionIdProperty": "$context.connectionId",
"myQueryParams": $input.params()
}
テンプレート式で利用可能な変数のマニュアルを見つけることができます こちら 。
($request
は、テンプレートの選択式では、テンプレート自体で有効な変数ではありません。代わりに$input
を使用してください。)
ConnectionIDをコンテキスト変数から取得できます。 WebSocket APIの使用可能な変数については、 https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-websocket-api-mapping-template-reference.html
Lambda関数では、Event.RequestContextを介してコンテキスト変数にアクセスできます。
Francois Starkに感謝します。
私自身の実験を通して、私は$ request.body.ackeActionの特定の値を一致させる必要性を避けることができます。$既定のルートと次の形式を使用して。
_{"connectionId": "$context.connectionId", "body": $input.body}
_
この設定では、HTTPエンドポイントは、単一のルートを使用して 'Action'のすべての値のボディデータとしてConnectionIDを取得する必要があります。
さらに、_$connect
_と_$disconnect
_ routesに接続されているため、リクエストテンプレートの形式は同じですが、これらのイベントにはボディデータがないため、ボディを省略することができます。
_{"connectionId": "$context.connectionId"}
_
この設定では、HTTPエンドポイントは$ CONNECTと$ DISCONNECTイベントのBODYデータとしてConnectionIDを取得する必要があります。
Event.RequestContextからConnectionIDを取得できます。
exports.handler = async (event) => {
const data = event['body'];
const connectionId = event['requestContext']['connectionId'];};
_