

# 针对 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。要完成本教程，您需要一个将 `$request.body.action` 作为路由选择表达式的 WebSocket API 和一个用于新路由的集成端点。

还需要 `wscat` 以连接到 API。有关更多信息，请参阅 [使用 `wscat` 连接到 WebSocket API 并向其发送消息](apigateway-how-to-call-websocket-api-wscat.md)。

**创建模型**

1. 通过以下网址登录到 Amazon 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. 选择**创建路由**。

1. 对于**路由键**，请输入 **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. 选择**保存更改**。

在本步骤中，您将部署并测试您的 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"}
   ```