针对 API Gateway 中的 WebSocket API 的请求验证 - Amazon API Gateway
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

针对 API Gateway 中的 WebSocket API 的请求验证

您可以配置 API Gateway,使其在继续集成请求之前对路由请求执行验证。如果验证失败,API Gateway 将在不调用后端的情况下使请求失败,向客户端发送“错误请求正文”网关响应,并在 CloudWatch Logs 中发布验证结果。通过这种方式使用验证可减少对 API 后端的不必要调用。

模型选择表达式

您可以使用模型选择表达式来动态验证同一路由中的请求。如果您为代理集成或非代理集成提供模型选择表达式,则会发生模型验证。当未找到匹配模型时,您可能需要将 $default 模型定义为回退。如果没有匹配模型且未定义 $default,则验证将失败。选择表达式类似于 Route.ModelSelectionExpression,并计算为 Route.RequestModels 的键。

当您为 WebSocket API 定义路由时,可以指定(可选)模型选择表达式。将会求解此表达式以选择在收到请求时用于正文验证的模型。表达式的求值结果为路由的 requestmodels 中的条目之一。

模型采用 JSON 架构表示,描述了请求正文的数据结构。此选择表达式的性质能让您为特定路由,在运行时动态选择要用于对照进行验证的模型。有关如何创建模型的信息,请参阅针对 REST API 的数据模型

使用 API Gateway 控制台设置请求验证

以下示例演示了如何在路径上设置请求验证。

首先,您创建一个模型,然后创建路由。接下来,在刚创建的路径上配置请求验证。最后,您部署并测试您的 API。要完成本教程,您需要一个将 $request.body.action 作为路由选择表达式的 WebSocket API 和一个用于新路由的集成端点。

还需要 wscat 以连接到 API。有关更多信息,请参阅 使用 wscat 连接到 WebSocket API 并向其发送消息

创建模型
  1. 通过以下网址登录到 Amazon API Gateway 控制台:https://console.aws.amazon.com/apigateway

  2. 选择 WebSocket API。

  3. 在主导航窗格中,选择模型

  4. 选择创建模型

  5. 对于名称,请输入 emailModel

  6. 对于内容类型,输入 application/json

  7. 对于模型架构,输入以下模型:

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

    此模型要求请求包含电子邮件地址。

  8. 选择 Save

在本步骤中,您将为 WebSocket API 创建路由。

要创建路由
  1. 在主导航窗格中,选择路由

  2. 选择创建路由

  3. 对于路由键,请输入 sendMessage

  4. 选择集成类型并指定集成端点。有关更多信息,请参阅API Gateway 中针对 WebSocket API 的集成

  5. 选择创建路由

在此步骤中,您将为 sendMessage 路径设置请求验证。

设置请求验证
  1. 路由请求选项卡上的路由请求设置下,选择编辑

  2. 模型选择表达式中,输入 ${request.body.messageType}

    API Gateway 使用 messageType 属性来验证传入的请求。

  3. 选择添加请求模型

  4. 对于模型密钥,输入 email

  5. 对于模型,选择 emailModel

    API Gateway 会根据此模型验证 messageType 属性设置为 email 的传入消息。

    注意

    如果 API Gateway 无法将模型选择表达式与模型密钥相匹配,则它会选择 $default 模型。如果没有 $default 模型,则验证将失败。对于生产 API,我们建议您创建一个 $default 模型。

  6. 选择保存更改

在本步骤中,您将部署并测试您的 API。

部署和测试您的 API
  1. 选择部署 API

  2. 从下拉列表中选择所需的阶段,或输入新阶段的名称。

  3. 选择部署

  4. 在主导航窗格中,选择阶段

  5. 复制 API 的 WebSocket URL。该 URL 应类似于 wss://abcdef123.execute-api.us-east-2.amazonaws.com/production

  6. 打开一个新终端,并使用以下参数运行 wscat 命令。

    wscat -c wss://abcdef123.execute-api.us-west-2.amazonaws.com/production
    Connected (press CTRL+C to quit)
  7. 使用以下命令来测试您的 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"}