

# WebSocket 选择表达式
<a name="apigateway-websocket-api-selection-expressions"></a>

API Gateway 使用选择表达式作为一种评估请求和响应上下文并生成键的方法。然后，该键用于从通常由您，即 API 开发人员提供的一组可能值中进行选择。确切的受支持变量集将因特定表达式而异。下文更为详细地描述了每个表达式。

对于所有表达式，该语言遵循相同的规则集：
+ 变量以 `"$"` 为前缀。
+ 大括号可用于明确定义变量边界，例如，`"${request.body.version}-beta"`。
+ 支持多个变量，但评估仅发生一次（无递归评估）。
+ 可以使用 `$` 对美元符号 (`"\"`) 进行转义。这在定义映射到保留的 `$default` 键（例如 `"\$default"`）的表达式时非常有用。
+ 在某些情况下，需要模式格式。在这种情况下，表达式应该用正斜杠 (`"/"`) 包装起来，例如，`"/2\d\d/"`，以便匹配 `2{{XX}}` 状态代码。

**Topics**
+ [路由响应选择表达式](#apigateway-websocket-api-route-response-selection-expressions)
+ [API 键选择表达式](#apigateway-websocket-api-apikey-selection-expressions)
+ [API 映射选择表达式](#apigateway-websocket-api-mapping-selection-expressions)
+ [WebSocket 选择表达式摘要](#apigateway-websocket-api-selection-expression-table)

## 路由响应选择表达式
<a name="apigateway-websocket-api-route-response-selection-expressions"></a>

[路由响应](apigateway-websocket-api-route-response.md)用于对从后端到客户端的响应建模。对于 WebSocket API，路由响应是可选的。定义后，它向 API Gateway 发出信号，表示它应该在收到 WebSocket 消息时向客户端返回响应。

*路由响应选择表达式*的求解会产生路由响应键。最终，此密钥将用于从与 API 相关联的一个 [https://docs.aws.amazon.com/apigatewayv2/latest/api-reference/apis-apiid-routes-routeid-routeresponses.html](https://docs.aws.amazon.com/apigatewayv2/latest/api-reference/apis-apiid-routes-routeid-routeresponses.html) 中进行选择。但是，目前仅支持 `$default` 键。

## API 键选择表达式
<a name="apigateway-websocket-api-apikey-selection-expressions"></a>

如果服务确定仅当客户端提供有效的 [API 键](api-gateway-basic-concept.md#apigateway-definition-api-key)时给定的请求才应继续，则会求解此表达式。

目前，仅支持的两个值是 `$request.header.x-api-key` 和 `$context.authorizer.usageIdentifierKey`。

## API 映射选择表达式
<a name="apigateway-websocket-api-mapping-selection-expressions"></a>

将会求解估此表达式以确定在使用自定义域发出请求时选择哪个 API 阶段。

目前，唯一支持的值是 `$request.basepath`。

## WebSocket 选择表达式摘要
<a name="apigateway-websocket-api-selection-expression-table"></a>

下表总结了 WebSocket API 中的选择表达式的用例：


| 选择表达式 | 求解为以下对象的键 | 备注 | 示例使用案例 | 
| --- | --- | --- | --- | 
| Api.RouteSelectionExpression | Route.RouteKey | $default支持 作为包罗万象的路由。 | 根据客户端请求的上下文路由 WebSocket 消息。 | 
| Route.ModelSelectionExpression | Route.RequestModels 的键 | 可选。<br />如果是为非代理集成提供的，则会发生模型验证。<br />`$default`支持 作为包罗万象的路由。 | 在同一路径中动态执行请求验证。 | 
| Integration.TemplateSelectionExpression | Integration.RequestTemplates 的键 | 可选。<br />可以为非代理集成提供，用于处理传入的负载。<br />`${request.body.jsonPath}`支持 和静态值。<br />`$default`支持 作为包罗万象的路由。 | 根据请求的动态属性处理调用方的请求。 | 
| Integration.IntegrationResponseSelectionExpression | IntegrationResponse.IntegrationResponseKey | 可选。可以为非代理集成提供。<br />充当错误消息（来自 Lambda）或状态代码（来自 HTTP 集成）的模式匹配。<br />`$default`非代理集成需要 来充当包罗万象的成功响应。 | 处理来自后端的响应。<br />选择根据后端的动态响应发生的操作（例如，明显地处理某些错误）。 | 
| IntegrationResponse.TemplateSelectionExpression | IntegrationResponse.ResponseTemplates 的键 | 可选。可以为非代理集成提供。支持 $default。 | 在某些情况下，响应的动态属性可能决定相同路径和相关集成内的不同变换。<br />支持 `${request.body.jsonPath}`、`${integration.response.statuscode}`、`${integration.response.header.headerName}`、`${integration.response.multivalueheader.headerName}` 和静态值。<br />`$default`支持 作为包罗万象的路由。 | 
| Route.RouteResponseSelectionExpression | RouteResponse.RouteResponseKey | 应提供以对 WebSocket 路由启动双向通信。<br />目前，此值仅限于 `$default`。 |  | 
| RouteResponse.ModelSelectionExpression | RouteResponse.RequestModels 的键 | 目前不受支持。 |  | 