

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

# 請求驗證 API Gateway 中的 WebSocket API
<a name="websocket-api-request-validation"></a>

您可以將 API Gateway 設定為對路由執行驗證，再繼續進行整合請求。如果驗證失敗，API Gateway 的請求失敗，而不呼叫後端、傳送與以下用戶端類似的「錯誤的請求內文」閘道回應，以及在 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。若要完成本教學課程，您需要 WebSocket API 搭配 `$request.body.action` 做為新路由的路由選擇表達式和整合端點。

您還需要 `wscat` 來連線到 API。如需詳細資訊，請參閱[使用 `wscat` 以連接到 WebSocket API 和將訊息傳送到其中](apigateway-how-to-call-websocket-api-wscat.md)。

**建立裝置**

1. 在以下網址登入 API Gateway 主控台：[https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway)。

1. 選擇 WebSocket API。

1. 在主導覽窗格中，選擇**模型**。

1. 選擇**建立模型**。

1. 對於**名稱**，輸入 **emailModel**。

1. 針對**內容類型**，輸入 **application/json**。

1. 針對**模型結構描述**，輸入下列模型：

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

   此模型要求該請求應包含電子郵件地址。

1. 選擇**儲存**。

在此步驟中，為 WebSocket API 建立路由。

**建立路由**

1. 在主要導覽窗格中，選擇**路由**。

1. 選擇 **Create route (建立路由)**。

1. 對於 **Route key (路由金鑰)**，輸入 **sendMessage**。

1. 選擇整合類型並指定整合端點。如需更多資訊，請參閱[API Gateway 中 WebSocket API 的整合](apigateway-websocket-api-integrations.md)。

1. 選擇 **Create route (建立路由)**。

在此步驟中，設定 `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. 選擇**儲存變更**。

在此步驟中，您會部署和測試 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"}
   ```