请求验证 - Amazon API Gateway

请求验证

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

模型选择表达式

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

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

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

使用 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. 选择保存

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

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

  2. 选择创建路由

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

  4. 选择集成类型并指定集成端点。有关更多信息,请参阅设置 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. 选择 Save changes(保存更改)

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