

# API Gateway での WebSocket API のリクエスト検証
<a name="websocket-api-request-validation"></a>

統合リクエストを進める前にルートリクエストの検証を実行するよう API Gateway を設定できます。検証に失敗すると、API ゲートウェイはバックエンドを呼び出さずにリクエストを失敗させ、「Bad request body」というゲートウェイレスポンスをクライアントに送信し、CloudWatch Logs に検証の失敗を発行します。このように検証を使用すると、APIバックエンドへの不要な呼び出しを減らすことができます。

## モデル選択式
<a name="apigateway-websocket-api-model-selection-expressions"></a>

モデル選択式を使用して、同じルート内のリクエストを動的に検証できます。モデルの検証は、プロキシ統合または非プロキシ統合のモデル選択式を指定した場合に行われます。一致するモデルが見つからない場合は、`$default` モデルをフォールバックとして定義する必要があります。一致するモデルが存在せず、`$default` が定義されていない場合、検証は失敗します。選択式は `Route.ModelSelectionExpression` のような外観で 、`Route.RequestModels` のキーに評価されます。

WebSocket API のルートを定義する場合、オプションで*モデル選択式*を指定できます。この式は評価され、リクエストが受信されたときに本文の検証に使用されるモデルが選択されます。この式はルートの [https://docs.aws.amazon.com/apigatewayv2/latest/api-reference/apis-apiid-routes.html#apis-apiid-routes-prop-route-requestmodels](https://docs.aws.amazon.com/apigatewayv2/latest/api-reference/apis-apiid-routes.html#apis-apiid-routes-prop-route-requestmodels) のいずれかのエントリに評価されます。

モデルは [JSON スキーマ](https://datatracker.ietf.org/doc/html/draft-zyp-json-schema-04)としてで表され、リクエストボディのデータ構造を説明します。この選択式の特性により、特定のルートに対して実行時に検証するモデルを動的に選択できます。モデルを作成する方法については、「[REST API のデータモデル](models-mappings-models.md)」を参照してください。

## API Gateway コンソールを使用してリクエストの検証を設定する
<a name="apigateway-websocket-api-model-selection-expression-example"></a>

次の例は、ルートにリクエストの検証を設定する方法を示しています。

 最初にモデルを作成し、次にルートを作成します。次に、作成したルートにリクエストの検証を設定します。最後に、API をデプロイしてテストします。このチュートリアルを完了するには、`$request.body.action` をルート選択式とする WebSocket API と、新しいルートの統合エンドポイントが必要です。

また、API に接続するには `wscat` も必要です。詳細については、「[`wscat` を使用した WebSocket API への接続とメッセージの送信](apigateway-how-to-call-websocket-api-wscat.md)」を参照してください。

**モデルを作成するには**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway) で API Gateway コンソールにサインインします。

1. WebSocket API を選択します。

1. ナビゲーションペインで、**[モデル]** を選択します。

1. **[モデルの作成]** を選択します。

1. **[Name]** (名前) には **emailModel** を入力します。

1. **[コンテンツタイプ]** に、「**application/json**」と入力します。

1. **[モデルのスキーマ]** に次のモデルを入力します。

   ```
   {
       "$schema": "http://json-schema.org/draft-04/schema#",
       "type" : "object",
       "required" : [ "address"],
       "properties" : {
           "address": {
               "type": "string"
           }
       }
   }
   ```

   このモデルでは、リクエストに E メールアドレスを含める必要があります。

1. **[保存]** を選択します。

このステップでは、WebSocket API のルートを作成します。

**ルートを作成するには**

1. メインナビゲーションペインで、**[ルート]** を選択します。

1. [**ルートの作成**] を選択します。

1. [**Route key**] (ルートキー) に「**sendMessage**」と入力します。

1. 統合タイプを選択し、統合エンドポイントを指定します。詳細については、「[API Gateway での WebSocket API の統合](apigateway-websocket-api-integrations.md)」を参照してください。

1. [**ルートの作成**] を選択します。

このステップでは、`sendMessage` ルートに対するリクエストの検証を設定します。

**リクエストの検証を設定するには**

1. **[ルートリクエスト]** タブの **[ルートリクエスト設定]** で、**[編集]** を選択します。

1. **[モデル選択式]** に、「**\$1\$1request.body.messageType\$1**」と入力します。

   API Gateway は、`messageType` プロパティを使用して受信リクエストを検証します。

1. **[リクエストモデルを追加]** を選択します。

1. **[モデルキー]** に、「**email**」と入力します。

1. **[モデル]**] で、**[emailModel]** を選択します。

   API Gateway は、`messageType` プロパティが `email` に設定されている受信メッセージを、このモデルと照合して検証します。
**注記**  
API Gateway は、モデル選択式とモデルキーを一致させることができない場合、`$default` モデルを選択します。`$default` モデルが存在しない場合、検証は失敗します。本番稼働 API の場合は、`$default` モデルを作成することをお勧めします。

1. **[Save changes]** (変更の保存) をクリックします。

このステップでは、API をデプロイしてテストします。

**API をデプロイしてテストするには**

1. [**API のデプロイ**] を選択します。

1. ドロップダウンリストから目的のステージを選択するか、新しいステージの名前を入力します。

1. **[デプロイ]** をクリックします。

1. メインナビゲーションペインで、**[ステージ]** を選択します。

1. API の WebSocket URL をコピーします。URL は `wss://abcdef123.execute-api.us-east-2.amazonaws.com/production` のようになります。

1. 新しいターミナルを開き、次のパラメータを指定して **wscat** コマンドを実行します。

   ```
   wscat -c wss://abcdef123.execute-api.us-west-2.amazonaws.com/production
   ```

   ```
   Connected (press CTRL+C to quit)
   ```

1. 次のコマンドを使用して API をテストします。

   ```
   {"action": "sendMessage", "messageType": "email"}
   ```

   ```
   {"message": "Invalid request body", "connectionId":"ABCD1=234", "requestId":"EFGH="}
   ```

   API Gateway はリクエストを失敗させます。

   次のコマンドを使用して API に有効なリクエストを送信します。

   ```
   {"action": "sendMessage", "messageType": "email", "address": "mary_major@example.com"}
   ```