本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
请求验证
您可以配置 API Gateway,使其在继续集成请求之前对路由请求执行验证。如果验证失败,API Gateway 会在不调用您的后端的情况下使请求失败,向客户端发送 “错误的请求正文” 网关响应,并将验证结果发布到 CloudWatch 日志中。通过这种方式使用验证可减少对 API 后端的不必要调用。
模型选择表达式
您可以使用模型选择表达式来动态验证同一路由中的请求。如果您为代理集成或非代理集成提供模型选择表达式,则会发生模型验证。当未找到匹配模型时,您可能需要将 $default
模型定义为回退。如果没有匹配模型且未定义 $default
,则验证将失败。选择表达式类似于 Route.ModelSelectionExpression
,并计算为 Route.RequestModels
的键。
在为 WebSocket API 定义路由时,您可以选择指定模型选择表达式。将会求解此表达式以选择在收到请求时用于正文验证的模型。表达式的求值结果为路由的 requestmodels
中的条目之一。
模型采用 JSON 架构
使用 API Gateway 控制台设置请求验证
以下示例向您展示了如何在路径上设置请求验证。
首先,创建模型,然后创建路线。接下来,在刚刚创建的路径上配置请求验证。最后,部署和测试您的 API。要完成本教程,您需要一个$request.body.action
用作路径选择表达式的 WebSocket API 和用于新路径的集成端点。
还需要 wscat
以连接到 API。有关更多信息,请参阅使用 wscat 连接到 WebSocket API 并向其发送消息。
创建模型
通过以下网址登录到 API Gateway 控制台:https://console.aws.amazon.com/apigateway
。 选择一个 WebSocket API。
在主导航窗格中,选择模型。
选择 创建模型。
对于名称,请输入
emailModel
。对于内容类型,输入
application/json
。对于模型架构,输入以下模型:
{ "$schema": "http://json-schema.org/draft-04/schema#", "type" : "object", "required" : [ "address"], "properties" : { "address": { "type": "string" } } }
此模型要求请求中包含电子邮件地址。
选择保存。
在此步骤中,您将为您的 WebSocket API 创建路由。
要创建路由
在主导航窗格中,选择 “路由”。
选择 Create route (创建路由)。
对于 Route key(路由键),请输入
sendMessage
。选择集成类型并指定集成端点。有关更多信息,请参阅 设置 WebSocket API 集成。
选择 Create route (创建路由)。
在此步骤中,您将为sendMessage
路径设置请求验证。
设置请求验证
在 “路由请求” 选项卡的 “路由请求设置” 下,选择 “编辑”。
在模型选择表达式中,输入
${request.body.messageType}
。API Gateway 使用该
messageType
属性来验证传入的请求。选择添加请求模型。
在 “模型密钥” 中,输入
email
。对于模特,请选择 Email Model。
API Gateway 会
email
根据此模型将messageType
属性设置为,验证传入的消息。注意
如果 API Gateway 无法将模型选择表达式与模型密钥相匹配,则它会选择
$default
模型。如果没有$default
模型,则验证失败。对于生产 API,我们建议您创建$default
模型。选择 保存更改。
在此步骤中,您将部署和测试您的 API。
部署和测试您的 API
选择部署 API。
从下拉列表中选择所需的阶段,或输入新阶段的名称。
选择部署。
在主导航窗格中,选择阶段。
复制您的 API 的 WebSocket 网址。该 URL 应类似于
wss://
。abcdef123
.execute-api.us-east-2
.amazonaws.com/production打开一个新终端并使用以下参数运行wscat命令。
wscat -c wss://
abcdef123
.execute-api.us-west-2
.amazonaws.com/productionConnected (press CTRL+C to quit)
使用以下命令测试您的 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"}